将字符串转换为double或float c#

时间:2014-08-16 08:10:32

标签: c# double string-conversion

我需要将字符串转换为double。或漂浮,无论什么最适合这种类型的转换。

字符串是" 25.00"。

我如何转换此字符串以便在计算中使用它?

我试过了:

string s1 = "2";
string s2 = "25.00";

double d1 = Convert.ToDouble(s1);
double d2 = Convert.ToDouble(s2);
double d3 = d2 * d1;

我也试过这个:

string s1 = "2";
string s2 = "25.00";

double d1 = double.Parse(s1);
double d2 = double.Parse(s2);
double d3 = d2 * d1;

string s1 = "2";
string s2 = "25.00";

float f1 = float.Parse(s1);
float f2 = float.Parse(s2);
float f3 = f2 * f1;

这些似乎都不起作用,我得到了一个形式感觉。

3 个答案:

答案 0 :(得分:5)

我怀疑您的默认文化信息使用逗号作为小数点分隔符而不是点。如果您知道您的输入将有一个点,那么最好明确指定不变文化:

double d1 = double.Parse(s1, CultureInfo.InvariantCulture);
double d2 = double.Parse(s2, CultureInfo.InvariantCulture);

但是,如果十进制值很重要,您应该考虑使用decimal而不是floatdouble

decimal d1 = decimal.Parse(s1, CultureInfo.InvariantCulture);
decimal d2 = decimal.Parse(s2, CultureInfo.InvariantCulture);

答案 1 :(得分:4)

如果您收到格式异常,则表示您运行代码的文化不会使用.字符作为其小数分隔符。你可以做几件事:

  1. 将您的全球文化更改为使用.字符作为其小数点分隔符
  2. 的文化
  3. 使用您的文化小数分隔符
  4. 手动替换.字符
  5. 调用包含IFormatProvider实例
  6. 的各种解析方法的重载

    到目前为止,我认为第三种选择是最好的。它允许您指定解析方法所期望的格式。 CultureInfo类实现IFormatProvider接口。在您的代码中,您希望.字符为小数分隔符。在几种文化中都是如此,但您最安全的选择可能是InvariantCulture

    您可以按如下方式修改代码:

    string s1 = "2"; 
    string s2 = "25.00";
    
    double d1 = Convert.ToDouble(s1, CultureInfo.InvariantCulture);
    double d2 = Convert.ToDouble(s2, CultureInfo.InvariantCulture);
    double d3 = d2 * d1;
    
    string s1 = "2";
    string s2 = "25.00";
    
    double d1 = double.Parse(s1, CultureInfo.InvariantCulture);
    double d2 = double.Parse(s2, CultureInfo.InvariantCulture);
    double d3 = d2 * d1;
    
    string s1 = "2";
    string s2 = "25.00";
    
    float f1 = float.Parse(s1, CultureInfo.InvariantCulture);
    float f2 = float.Parse(s2, CultureInfo.InvariantCulture);
    float f3 = f2 * f1;
    

    此处,CultureInfo班级' NumberFormat属性用于确定将字符串解析为doublefloat时使用的小数分隔符。

    我创建了一个.NET小提琴,向您展示它的工作原理:https://dotnetfiddle.net/Z5HB4T

    您可以使用NumberDecimalSeparator CultureInfo属性的NumberFormat属性查看特定区域性的小数点分隔符:

    // Returns: "."
    CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
    
    // Outputs: "."
    new CultureInfo("en-US").NumberFormat.NumberDecimalSeparator;
    
    // Returns: ","
    new CultureInfo("nl-NL").NumberFormat.NumberDecimalSeparator;
    
    // Returns: "<depends on what is set as the current culture>"
    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    

    请参阅:https://dotnetfiddle.net/nSbYoP

    有趣的是,NumberFormat属性的类型为NumberFormatInfo,它还实现了IFormatProvider!这意味着您还可以将NumberFormatInfo实例传递给解析方法。这允许您完全根据自己的喜好创建数字格式。然后,我们可以使用我们喜欢的任何十进制数字分隔符以下示例将十进制数分隔符更改为#字符:

    var numberFormatInfo = new NumberFormatInfo();
    numberFormatInfo.NumberDecimalSeparator = "#";
    
    string s1 = "2"; 
    string s2 = "25#00";
    
    double d1 = Convert.ToDouble(s1, numberFormatInfo);
    double d2 = Convert.ToDouble(s2, numberFormatInfo);
    double d3 = d2 * d1;
    

    请参阅:https://dotnetfiddle.net/h6ex2Z

    这种方法让您可以完全自由地理解解析数字的解析方法。

答案 2 :(得分:0)

有时当您将字符串“4.1”转换为双倍时,转换将为您提供41,为此您可以轻松修复替换“。”用“,” EJ: double ress = Convert.toDouble(“4.1”.replace(“。”,“,”);