我必须以字符串格式发送一个小数。字符串的最大长度为 15。如何通过四舍五入来做到这一点?
例如:
1111111111111119 = “111111111111112”
11111111111111.111 = “11111111111111”
1.11111111111119 = "1.1111111111112"
谢谢
我发现了一种非常不优雅的方法,但它可以处理您的测试用例和我发现的另一个边缘案例:
static string ToStringOfMaxLength(decimal x) {
const int maxLength = 15;
var str = x.ToString(System.Globalization.CultureInfo.InvariantCulture);
if(str.Length <= maxLength)
return str;
if(str[maxLength] == '.')
return str.Substring(0, maxLength);
if(str[maxLength - 1] == '.')
return str.Substring(0, maxLength - 1);
var digitsToDisplayExceptLast = str.Substring(0, maxLength - 1);
var lastDigitToDisplay = CharToInt(str[maxLength - 1]);
var firstDigitNotDisplayed = CharToInt(str[maxLength]);
if(firstDigitNotDisplayed >= 5)
lastDigitToDisplay++;
return digitsToDisplayExceptLast + lastDigitToDisplay;
}
static int CharToInt(char c) {
return (int)(c - 48);
}
此功能应该完全符合您的需要(在您的示例值上测试):
string ValueString15(decimal value)
{
while (value >= 1000000000000000M) // for your first example case
value /= 10;
int dotIndex = value.ToString(CultureInfo.InvariantCulture).IndexOf('.');
value = (dotIndex >= 14) ? Math.Round(value) : Math.Round(value, 14 - dotIndex);
return value.ToString(CultureInfo.InvariantCulture);
}
如果需要处理负值(即 value < 0),还应添加:
|| value <= -100000000000000M
到 while 条件。
如果您只想将字符串剪切为 15 个字符,
decimal sample = 123456789123456789;
string result = sample.ToString().Substring(0, 15); // this cuts it to 15 characters
**returns 123456789123456**
如果你想从 15 个字符开始四舍五入。
decimal sample = 123456789123456789;
double result2 = Math.Round(sample.ToString().Substring(0, 16));
**returns 123456789123457**