You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小数全零忽略、非零取前两位的C#代码实现问题求助

解决C#数字格式化需求:小数全0留整数,否则保留两位小数

我来帮你搞定这个数字格式化的问题!先聊聊你现有代码的问题,再给你两个靠谱的实现思路。

现有代码的问题分析

你的代码逻辑存在几个关键漏洞:

  1. 判断条件逻辑错误:!splitSku4[1].StartsWith("0") || !splitSku4[1].StartsWith("00")这个条件完全没办法准确识别“小数部分全为0”的情况。比如当小数部分是"0000"时,两个StartsWith都是true,取反后都是false,条件整体为false,不会进入处理逻辑,导致最终结果还是带小数点的字符串。
  2. 未处理小数部分长度不足2的情况:如果输入是"35.0",拆分后小数部分是"0",执行Substring(0,2)会直接抛出索引越界异常,因为字符串长度不够2。
  3. 没有覆盖无小数部分的场景:如果输入是纯整数(比如"35"),拆分后数组长度为1,代码完全没有处理这种情况,sku4可能会保持初始值或者为空。

实现思路1:纯字符串处理(精准匹配需求)

这种方法直接操作字符串,完全贴合你的规则,不需要担心数值转换的精度问题:

string value = "35.98759"; // 替换为你的输入值
string sku4;

var parts = value.Split('.');
if (parts.Length == 1)
{
    // 没有小数部分,直接用整数部分
    sku4 = parts[0];
}
else
{
    string integerPart = parts[0];
    string decimalPart = parts[1];
    
    // 检查小数部分是否全为0
    bool isAllZero = decimalPart.All(c => c == '0');
    if (isAllZero)
    {
        sku4 = integerPart;
    }
    else
    {
        // 截取前两位小数,不足两位时补0(比如"35.5"会变成"35.50")
        string truncatedDecimal = decimalPart.PadRight(2, '0').Substring(0, 2);
        sku4 = $"{integerPart}.{truncatedDecimal}";
        
        // 如果不需要补0,改成下面这行:
        // string truncatedDecimal = decimalPart.Length >= 2 ? decimalPart.Substring(0, 2) : decimalPart;
    }
}

逻辑说明:

  • 拆分字符串为整数和小数两部分,先处理纯整数的情况。
  • 用All(c => c == '0')精准判断小数部分是否全为0,是的话直接返回整数部分。
  • 非全0的情况,要么补0后取前两位,要么直接取现有长度(根据你的需求调整),避免索引越界问题。

实现思路2:数值类型转换(更简洁)

如果你的输入字符串肯定是有效的数字,可以用decimal类型转换来实现,逻辑更简洁:

string value = "35.0193"; // 替换为你的输入值
string sku4;

// 先尝试解析为decimal,避免无效输入报错
if (decimal.TryParse(value, out decimal number))
{
    if (number == decimal.Truncate(number))
    {
        // 是整数,输出不带小数的格式
        sku4 = number.ToString("F0");
    }
    else
    {
        // 截断到两位小数(注意:不是四舍五入,完全匹配你的示例)
        decimal truncated = decimal.Truncate(number * 100) / 100;
        sku4 = truncated.ToString("0.00");
    }
}
else
{
    // 处理输入不是有效数字的情况,比如返回原字符串或者抛出异常
    sku4 = value;
}

逻辑说明:

  • 用decimal.TryParse确保输入是有效数字,避免崩溃。
  • decimal.Truncate(number)会去掉小数部分,和原数对比就能判断是否是整数。
  • 非整数时,通过*100后截断再/100的方式,实现两位小数的截断(完全符合你示例中的35.98759→35.98效果)。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:14