【问题标题】:How to format a double with fixed number of significant digits, regardless of the decimal places? [duplicate]无论小数位如何,如何格式化具有固定有效位数的双精度数? [复制]
【发布时间】:2014-10-07 20:54:57
【问题描述】:

也许我的措辞不清楚,所以我试图举例说明:

  • 如果我有一个像 123.4567 这样的双精度,我想将其格式化为 123
  • 如果我有一个像 12.34567 这样的双精度,我想将其格式化为 12.3
  • 如果我有一个像 1.234567 这样的双精度,我想将其格式化为 1.23

当然,我可以使用 switch/case 语句来做到这一点,但我想知道是否有任何内置或实用程序格式,开箱即用可以做到这一点。

提前致谢

【问题讨论】:

  • 只是为了确定:如果你有一个像 12345.67 这样的双精度,你想把它格式化为 12300?
  • 我认为他的意思是 12345.67 应该是 123。
  • 如果 12345.67 应该是 123,那我不明白这个赋值。
  • 感谢您的提问,好点子。我的号码总是在 0 到 999 之间
  • “G”格式说明符不符合您的要求吗?

标签: c# .net


【解决方案1】:

使用 G3 格式说明符:

  String result1 = 123.4567.ToString("G3");
  String result2 = 1.234567.ToString("G3");

或通过String.Format

  String result = String.Format("{0:G3}", 12.3456789);

【讨论】:

  • Yes is is,除了:Convert.ToDouble(String.Format("{0:G3}", number)).ToString() 以防止得到指数形式。
【解决方案2】:

这是一个java代码,我猜也可以用于C#..

   public static double round(double value) {
       int places = 0;
       BigDecimal bd = new BigDecimal(value);
       if(value>=100){
           places=0;
       }else if(value<=100 && value>=10){
           places = 1;
       }else{
           places = 2;
       }
        bd = bd.setScale(places,RoundingMode.UP);
      return bd.doubleValue();
    }

【讨论】:

    【解决方案3】:

    我不知道是否有更简单的东西,但这应该可以满足您的需求:

    public static string TakeNumDigits(decimal number, int digits, NumberFormatInfo formatProvider = null)
    {
        formatProvider = formatProvider ?? NumberFormatInfo.CurrentInfo;
        string num = number.ToString(formatProvider);
        if (digits >= num.Length)
            return num;
    
        string decSep = formatProvider.NumberDecimalSeparator;
        int decSepIndex = num.IndexOf(decSep);
    
        if (decSepIndex == -1 || decSepIndex + digits > num.Length)
            return num.Substring(0, digits);
        else
            return num.Substring(0, digits + decSep.Length);
    }
    

    您的样品:

    decimal num1 = 123.4567m;
    string result = TakeNumDigits(num1, 3); // 123
    decimal num2 = 12.34567m;
    result = TakeNumDigits(num2, 3);        // 12.3
    decimal num3 = 1.234567m;
    result = TakeNumDigits(num3, 3);        // 1.23
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2012-05-11
      • 2011-12-25
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多