【问题标题】:c# Correct way to convert string value to decimalc#将字符串值转换为十进制的正确方法
【发布时间】:2017-11-17 15:33:10
【问题描述】:

我需要将 "101.46" 格式的任意值转换为 十进制

string s = "101.46";
decimal value = Convert.ToDecimal(s);

但十进制最终值始终为 10146。我需要输出值的格式为 101.46 as decimal

【问题讨论】:

  • 你的语言环境是什么?
  • 在您的语言环境中,. 是小数还是千位分隔符?
  • 巴西,我在我的 aspnet 应用程序的 web.config 中将文化信息设置为“pt-BR,但没有成功。

标签: c# type-conversion decimalformat


【解决方案1】:

Convert.ToDecimal 将使用当前正在执行的线程的文化——我的猜测是,在你的情况下,这是一种使用, 作为小数分隔符而不是. 的文化。您只需要指定正确的文化——通常是invariant culture——这几乎总是用于任何旨在机器可读的字符串的正确文化。 (你也应该使用不变的文化来创建这样的字符串。)

我通常建议使用静态 Parse 方法而不是 Convert.ToXyz(因为它们通常更有能力,并且也有 TryParse 选项),所以虽然您可以通过Convert.ToDecimal 的不变文化,我会使用:

decimal value = decimal.Parse(text, CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:

    您当前的文化似乎使用, 作为小数分隔符,那么您可以使用:

    decimal value = decimal.Parse(s, CultureInfo.InvariantCulture);
    

    【讨论】:

      【解决方案3】:
      public static boolean isNumeric(String str)  
      {  
        try  
        {  
          decimal d = decimal.parseDouble(str);  
        }  
        catch(NumberFormatException nfe)  
        {  
          return false;  
        }  
        return true;  
      }
      

      如果你想使用正则表达式,你可以使用如下,

      public static boolean isNumeric(String str)
      {
        return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
      }
      

      如果函数返回真则

      if(isNumeric(Yourvalue)){
        decimal value = decimal.Parse(s, CultureInfo.InvariantCulture);
      }
      

      【讨论】:

      • 似乎不必要的复杂......也许已经有一个内置的TryParse方法??
      • 如果值不是数字,这将帮助您记录和设置默认值。或执行某些操作。我首先使用这个静态函数,这样我就可以编写正确的日志。但并非所有人都同意这一点。这就是我的编码方式@Igor
      • 您可以使用decimal.TryParse 实现所有这些,不需要您的任何自定义方法。
      • @Igor 你同意抛出异常会让你的代码变慢吗?如果我们可以用正则表达式捕捉到这一点,为什么不这样做呢?
      • 因为您可以使用decimal.TryParse 实现这一目标。不需要正则表达式。 decimal.TryParse 有一个out 参数(十进制类型),如果方法返回true,则填充一个值,如果返回false,则解析不成功。不会抛出异常。作为奖励,它还需要一个格式化参数,您可以传递一个 CultureInfo 实例,这是用户在这种情况下需要的,因为这就是他们的代码不起作用的原因。
      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 2012-02-03
      • 2018-01-31
      • 1970-01-01
      • 2022-07-22
      • 2020-03-14
      • 2020-06-20
      • 2018-01-22
      相关资源
      最近更新 更多