【问题标题】:Convert string to decimal, keeping fractions将字符串转换为十进制,保留分数
【发布时间】:2010-11-24 08:27:19
【问题描述】:

我正在尝试将1200.00 转换为decimal,但Decimal.Parse() 删除了.00。我尝试了一些不同的方法,但它总是删除 .00,除非我提供的分数不是 0。

string value = "1200.00";

方法一

 var convertDecimal = Decimal.Parse(value ,  NumberStyles.AllowThousands
       | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol);

方法二

 var convertDecimal = Convert.ToDecimal(value);

方法3

var convertDecimal = Decimal.Parse(value,
       NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture);

如何将包含1200.00string 转换为包含1200.00decimal

【问题讨论】:

  • 我认为零是隐含的。 “.00”部分存在于十进制中,即使您看不到它们。出于格式化目的,您应该显示它们,但您不必担心。
  • @nmiranda:不,decimal 保持适当的比例。 decimal.Parse("1200.000")decimal.Parse("1200.00") 将返回不同的值,保留尾随 0 的数量。
  • 我同意@NelsonMiranda。实际上 decimal.Parse("1200.000").Equals(decimal.Parse("1200.00")) 返回 true,所以我看不出这个问题的意义......
  • 我可以确认这是非美国本地化的问题。我的电脑设置为意大利语区域设置,decimal.Parse("1200.00") 返回 120000,而 decimal.Parse("1200,00") 返回 1200.00

标签: c# string decimal


【解决方案1】:

嗯...我无法重现:

using System;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00");
        Console.WriteLine(d); // Prints 1200.00
    }
}

您确定不是您代码的其他部分稍后对十进制值进行规范化吗?

以防万一是文化问题,试试这个完全不依赖于你的语言环境的版本:

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00", CultureInfo.InvariantCulture);
        Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));
    }
}

【讨论】:

  • 是的,并且:十进制 d = decimal.Parse("1200.000"); Console.WriteLine(d); // 打印 1200.000 所以这不是文化问题。
  • 投票,以澄清下面的cmets
  • 尝试改变'.' ',' 的小数分隔符。如果结果不同,那就是文化问题。
【解决方案2】:

我认为你的问题是在显示小数时,而不是它的内容。

如果你尝试

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString();

s 将包含字符串"1200"

但是,如果您将代码更改为此

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString("0.00");

s 将包含字符串 "1200.00",如您所愿。

编辑

看来我今天一大早就脑残了。我现在添加了Parse 语句。然而,即使我的第一个代码也会输出“1200.00”,即使我预计它会输出“1200”。似乎我每天都在学习一些东西,在这种情况下显然是一些非常基础的东西。

所以忽略这是一个正确的答案。在这种情况下,我们可能需要更多代码来识别您的问题。

【讨论】:

  • @Øyvind - decimal 内部表示存储小数位零,即使它们在数学上无关紧要。所以虽然decimal.Parse("1200.00") == decimal.Parse("1200") .ToString() 值分别是“1200.00”和“1200”。 OP 不需要在.ToString() 方法中指定小数位。
  • @Enigmativity - 感谢您的解释:) 这感觉就像我很久以前就应该知道的......
【解决方案3】:

你好,我也有同样的问题,但很简单,这样做:

string cadena="96.23";

decimal NoDecimal=decimal.parse(cadena.replace(".",","))

我认为这是因为在十进制数上接受 C# 的符号带有“,”

【讨论】:

  • 你确定吗?它似乎取决于机器设置。
  • 我知道这已经很老了,但使用逗号而不是句点很可能是本地化。有些国家使用句点,有些使用逗号作为“小数点”。
【解决方案4】:

CultureInfo 类的使用对我有用,希望对你有所帮助。

    string value = "1200.00";
    CultureInfo culture = new CultureInfo("en-US");
    decimal result = Convert.ToDecimal(value, culture);

【讨论】:

    【解决方案5】:

    以下代码将值打印为 1200.00。

    var convertDecimal = Convert.ToDecimal("1200.00");
    Console.WriteLine(convertDecimal);
    

    不确定你期待什么?

    【讨论】:

      【解决方案6】:

      使用这个例子

      System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("en-GB",true);
      
      decimal currency_usd = decimal.Parse(GetRateFromCbrf("usd"),culInfo);
      decimal currency_eur = decimal.Parse(GetRateFromCbrf("eur"), culInfo);
      

      【讨论】:

        【解决方案7】:

        这是我自己想出的解决方案。这已准备好作为命令提示符项目运行。如果没有,你需要清理一些东西。希望这可以帮助。它接受多种输入格式,例如:1.234.567,89 1,234,567.89 等

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using System.Globalization;
            using System.Linq;
        
            namespace ConvertStringDecimal
            {
                class Program
                {
                    static void Main(string[] args)
                    {
                        while(true)
                        {
                            // reads input number from keyboard
                            string input = Console.ReadLine();
                            double result = 0;
                            // remove empty spaces
                            input = input.Replace(" ", "");
                            // checks if the string is empty
                            if (string.IsNullOrEmpty(input) == false)
                            {
                                // check if input has , and . for thousands separator and decimal place
                                if (input.Contains(",") && input.Contains("."))
                                {
                                    // find the decimal separator, might be , or .
                                    int decimalpos = input.LastIndexOf(',') > input.LastIndexOf('.') ? input.LastIndexOf(',') : input.LastIndexOf('.');
                                    // uses | as a temporary decimal separator
                                    input = input.Substring(0, decimalpos) + "|" + input.Substring(decimalpos + 1);
                                    // formats the output removing the , and . and replacing the temporary | with .
                                    input = input.Replace(".", "").Replace(",", "").Replace("|", ".");
                                }
                                // replaces , with .
                                if (input.Contains(","))
                                {
                                    input = input.Replace(',', '.');
                                }
                                // checks if the input number has thousands separator and no decimal places
                                if(input.Count(item => item == '.') > 1)
                                {
                                    input = input.Replace(".", "");
                                }
                                // tries to convert input to double
                                if (double.TryParse(input, out result) == true)
                                {
                                    result = Double.Parse(input, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
                                }
                            }
                            // outputs the result
                            Console.WriteLine(result.ToString());
                            Console.WriteLine("----------------");
                        }
                    }
                }
            }
        

        【讨论】:

          【解决方案8】:

          即使打印的表示不是您所期望的,该值也是相同的:

          decimal d = (decimal )1200.00;
          Console.WriteLine(Decimal.Parse("1200") == d); //True
          

          【讨论】:

            【解决方案9】:

            你可以尝试在你的程序中调用这个方法:

            static double string_double(string s)
                {
                    double temp = 0;
                    double dtemp = 0;
                    int b = 0;
                    for (int i = 0; i < s.Length; i++)
                    {
                        if (s[i] == '.')
                        {
                            i++;
                            while (i < s.Length)
                            {
                                dtemp = (dtemp * 10) + (int)char.GetNumericValue(s[i]);
                                i++;
                                b++;
                            }
                            temp = temp + (dtemp * Math.Pow(10, -b));
                            return temp;
                        }
                        else
                        {
                            temp = (temp * 10) + (int)char.GetNumericValue(s[i]);
                        }
                    }
                    return -1; //if somehow failed
                }
            

            例子:

            string s = "12.3";
            double d = string_double (s);        //d = 12.3 
            

            【讨论】:

              【解决方案10】:

              十进制 d = 3.00 仍然是 3。 我猜您想在屏幕上的某个位置显示它或将其打印为 3.00 的日志文件。 您可以执行以下操作

              string str = d.ToString("F2");
              

              或者如果您使用数据库来存储小数,那么您可以在数据库中设置pricision值。

              【讨论】:

                【解决方案11】:

                以下代码删除空格/字母并检查文化。无论小数分隔符. 还是, 都转换为小数并返回值。

                public decimal convertToDecimal(String str)
                {
                    // Decimal separator is ",".
                    CultureInfo culture = new CultureInfo("tr-TR");
                    // Decimal sepereator is ".".
                    CultureInfo culture1 = new CultureInfo("en-US");
                    // You can remove letters here by adding regex expression.
                    str = Regex.Replace(str, @"\s+|[a-z|A-Z]", "");
                    decimal result = 0;
                    var success = decimal.TryParse(str, NumberStyles.AllowThousands |
                        NumberStyles.AllowDecimalPoint, culture, out result);
                    // No need NumberStyles.AllowThousands or
                    // NumberStyles.AllowDecimalPoint but I used:
                    decimal result1 = 0;
                    var success1 = decimal.TryParse(str, NumberStyles.AllowThousands |
                        NumberStyles.AllowDecimalPoint, culture1, out result1);
                    if (success && success1)
                    {
                        if (result > result1)
                            return result1;
                        else
                            return result;
                    }
                    if (success && !success1)
                        return result;
                    if (!success && success1)
                        return result1;
                    return 0;
                }
                USAGE var decimal = convertToDecimal(string);
                

                【讨论】:

                  【解决方案12】:

                  这是你必须做的。

                  decimal d = 1200.00;    
                  string value = d.ToString(CultureInfo.InvariantCulture);
                  
                  // value = "1200.00" 
                  

                  这对我有用。谢谢。

                  【讨论】:

                    猜你喜欢
                    • 2011-10-31
                    • 1970-01-01
                    • 2015-07-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-11-29
                    相关资源
                    最近更新 更多