【问题标题】:C# Convert string to double/decimal and back to string, keeping trailing zeroes, adding comas for thousandsC# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号
【发布时间】:2018-01-02 03:14:21
【问题描述】:

我正在尝试获取用户输入,对其进行解析,然后用 String.Format() 显示,用逗号格式化数千个。

So, if user provides
1000  I will display 1,000
1000.00 => 1,000.00
1000.0  => 1,000.0
1,000.5 => 1,000.5

基本上,我想保留提供的所有小数(包括尾随零),并为数千添加格式。 我试过了:

String.Format("{0:#,0.######}" , Decimal.Parse(input));
String.Format("{0:#,0.######}" , Double.Parse(input);

【问题讨论】:

    标签: c# type-conversion double decimal trailing


    【解决方案1】:

    double.Parse(input) 是不行的,因为double 不跟踪小数位数。

    decimal.Parse(input).ToString() 将显示decimal 确实会跟踪它。不幸的是,decimal.Parse(input).ToString() 使用此精度并且不使用千位分隔符,decimal.Parse(input).ToString("N") 忽略精度但使用千位分隔符。

    不过,手动从小数中提取精度是可行的,这使您可以构建正确的格式字符串:

    static string InsertThousandsSeparator(string input) {
        var dec = decimal.Parse(input);
        var bits = decimal.GetBits(dec);
        var prec = bits[3] >> 16 & 255;
        return dec.ToString("N" + prec);
    }
    

    这是基于the layout of decimal as described on MSDN:

    位 16 到 23 必须包含 0 到 28 之间的指数,表示整数除以 10 的幂。

    See it working on .NET Fiddle.(@Alisson 提供)

    【讨论】:

    • 就是这样,所有测试用例都通过了(我自己测试过)。干净整洁的解决方案。
    • 优秀。非常感谢。我在想我需要写一些正则表达式,我真的很想避免。
    【解决方案2】:

    如果您不介意将 1000 转换为 1,000.00,那么以下是最好的,因为它也考虑了用户的语言环境。

    string output = String.Format("{0:n}", input);
    

    如果您想将 1000 转换为仅 1,000,则可以使用以下方法:

    string output2 = String.Format("{0:#,##0.##}", input);
    

    【讨论】:

    • "如果您不介意将 1000 转换为 1,000.00" -- 如果您不介意忽略问题中的内容,任何答案都有效,但问题具体涵盖了这一点。
    • 这不是 OP 要求的。他们希望保留相同的小数位数。
    • 同意,没有正确阅读问题的错误答案。我的错。
    【解决方案3】:

    您可以为此使用正则表达式:

    var input = "1000.50000";
    var regex = new Regex("^(?<int>-?[\\d,]+)\\.(?<fract>\\d+)$");
    var match = regex.Match(input);
    var integralPart = match.Groups["int"].Value.Replace(",", "");
    var fractionalPart = match.Groups["fract"].Value;
    var result = $"{decimal.Parse(integralPart):n0}.{fractionalPart}";
    

    【讨论】:

      【解决方案4】:
              public string DoFormat(string num)
          {
              int pt = num.IndexOf(".");
              if (pt > 0)
              {
                  return string.Format("{0:#,##0}", num.Substring(0, pt)) + num.Substring(pt, num.Length - pt);
              }
              else
              {
                  return string.Format("{0:#,##0}", num);
              }
          }
      

      这会在小数点处拆分字符串并返回小数点后的任何内容

      【讨论】:

        猜你喜欢
        • 2014-06-11
        • 1970-01-01
        • 2014-02-02
        • 2015-06-14
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多