C#如何将decimal转换为字符串并限制最大长度?

3
我必须将十进制数以字符串格式发送。字符串的最大长度为15。如何通过四舍五入来实现最佳匹配?例如:1111111111111119 = "111111111111112",11111111111111.111 = "11111111111111",1.11111111111119 = "1.1111111111112"。谢谢。

7
如果你有类似于“456456456456464654.6545646”这样的数字,想要删除第15位之后的字符,应该怎么做? - Sriram Sakthivel
是的,必须要吃。与遗留系统集成。 - user2794453
我不明白你为什么要这么做。如果你有一个 12345678901234567890 的数,并将其截断以适应长度 15,则会更改它的值(变为 123456789012345),你确定你想要这样做吗? - Alessandro D'Andria
3个回答

0

我找到了一种相当不优雅的方法来做这件事,但它可以处理您的测试用例和我发现的另一个边缘情况:

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);
}

0

这个函数应该可以完全满足你的需求(已经在你提供的示例值上进行了测试):

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);
}

如果您需要处理负数(即值 < 0),您还应该添加以下内容:
|| value <= -100000000000000M

到 while 条件。


-4
如果你想将字符串仅截取为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**

如果数字太小(导致长度小于15),则会抛出异常。 - Sriram Sakthivel
他要求完成一个具体的任务,就是将其减少15,他并没有问如何防止这个或那个。我猜想,由于他试图在第15个位置“剪切”,所以只有当它已经>15时才会执行。因此,他必须已经为此设置了条件。>.> - DevEstacion
有趣的是,你试图解决作者没有提出的问题,也许你应该找到一个像“在尝试获取子字符串时出现异常”的问题。也许你可以在那里提供帮助 LOLOL。 - DevEstacion
1
在你的生产代码中使用这种类型的代码。总有一天,你的代码会LOL你。学习防御式编程 - Sriram Sakthivel
太好笑了.. ROFL..:)) - Sriram Sakthivel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接