2012-07-19 69 views
32

我正在尝试编写一个基本上将字符串数组转换为字符串数组的函数,其中数组中的所有双精度都舍入为我设置的小数位数。数组中也可以有字符串,根本没有双精度值。解析字符串以逗号和点加倍

string[,] values = new string[1, 3]; 

values[0, 0] = "hello"; 
values[0, 1] = "0.123"; 
values[0, 2] = "0,123"; 

int decimalPlaces = 2; 

double tmp; 
string format = "F" + decimalPlaces.ToString(); 
IFormatProvider provider = CultureInfo.InvariantCulture; 
for (int i = 0; i < values.GetLength(0); i++) 
{ 
    for (int j = 0; j < values.GetLength(1); j++) 
    { 
     if (double.TryParse(values[i, j], out tmp)) 
     { 
      values[i, j] = tmp.ToString(format, provider); 
     } 
    } 
} 

Console.ReadLine(); 

结果却是:“你好”,“0.12”,“0.12”,但它是“你好”,“123.00”,“0.12”将把逗号以错误的方式。有没有人有一个简单而有效的解决方案呢?

回答

26

您想要像逗号(,)一样处理点(.)。因此,更换

if (double.TryParse(values[i, j], out tmp)) 

if (double.TryParse(values[i, j].Replace('.', ','), out tmp)) 
+12

解析时需要指定文化,否则只能在当前文化使用“,”作为小数点的地方使用。 – hultqvist 2013-10-30 09:39:58

+0

没错。谢谢你的提醒。 – mmdemirbas 2013-10-30 09:44:04

+1

我知道这个线程已经很长时间了,但是我会用'replace(char,char)'替换'Replace(string,string)'以获得更好的性能..... – Unknown6656 2016-02-22 09:11:19

12

问题是,您(或系统)无法区分千位分隔符的小数点分隔符,它们可以是逗号或点。例如:

以我培养,

1.123为1000以上的号码的常规表示法;而

1,123是一个数接近1

使用不变区域性默认使用的点作为十进制分隔。一般而言,您应该确保所有数字都是在所有系统上使用相同的恒定文化编写的(例如不变文化)。

如果你确定你的数字除了小数点分隔符(即没有数千个分隔符)之外从不包含任何逗号或点以外的任何内容,我会用逗号作为String.Replace(),并像你一样做其余的事情。

否则,您将很难编程能够区分1.1231,123而不知道文化的东西。

+0

同意,对我来说这是最合乎逻辑的解决方案。您还可以检查字符串是否包含“,”或“。”但这些解决方案中的任何一个都应该很好。 – eandersson 2012-07-19 12:15:23

0

您可以检查是否字符串包含使用

string s="";

 if (s.Contains(',')) 
     { 
     //treat as double how you wish 
     } 

一个小数点,然后可以把它作为一个小数,否则只是一起传递非双重价值。

79

要同时治疗,和。作为小数点,您不仅必须将其中一个替换为另一个,还要确保Culture使用的解析将其解释为小数点。

text = text.Replace(',', '.'); 
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 
+0

谢谢你,这对我有用。 – 2018-01-05 12:23:37

+0

为我工作。只是想我想要的。 – radbyx 2018-02-08 07:39:45

+0

最佳答案!整洁和高尚。 – 2018-02-26 17:32:30

18

你不需要替换逗号和点..

我遇到了同样的问题。原因很简单,转换文化起着很大的作用,逗号或点被解释。我使用德国文化,逗号区分分数,其中点在其他地方也是这样。

在这里我做了一个完整的例子,以明确区别。

string[] doubleStrings = {"hello", "0.123", "0,123"}; 
     double localCultreResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.CurrentCulture, out localCultreResult); 
      Console.WriteLine(string.Format("Local culture results for the parsing of {0} is {1}",doubleString,localCultreResult)); 

     } 


     double invariantCultureResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.InvariantCulture, out invariantCultureResult); 
      Console.WriteLine(string.Format("Invariant culture results for the parsing of {0} is {1}", doubleString, invariantCultureResult)); 

     } 

结果在下面 enter image description here

玩的文化,你会得到你需要的结果。

+0

我在几台具有不同文化设置的电脑上尝试了这种解决方案。它没有按预期工作。我稍后会发布另一个解决方案。 – Andrew 2016-11-08 03:11:02

+0

我试过这个,但它不适合我。请参阅链接中的图片。 CurrentCulture参数是德语。 https://imgur.com/QvtPt7S – batmaci 2017-10-09 00:49:26

0

试试这个......它适用于我。

double vdouble = 0; 
string sparam = "2,1"; 

if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
{ 
    if (sparam.IndexOf('.') != -1) 
    { 
     sparam = sparam.Replace('.', ','); 
    } 
    else 
    { 
     sparam = sparam.Replace(',', '.'); 
    } 

    if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
    { 
     vdouble = 0; 
    } 
} 
+3

也许你可以解释一下你在做什么。 “适合我”不是很具描述性。 – firelynx 2015-05-27 15:46:30

0

从字符串解析十进制数的扩展。

  • 无论数字在开头,结尾还是在字符串中间。
  • 无论是否只有数字或大量的“垃圾”字母。
  • 无论在PC上的文化设置中配置了什么分隔符:它都会正确解析点和逗号。
  • 手动设置小数点符号的能力。

    public static class StringExtension 
    { 
        public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = ',') 
        { 
         string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value; 
    
         if (tmp.Length > 0 && strToParse.Contains(tmp)) 
         { 
          var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator; 
    
          tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator); 
    
          return double.Parse(tmp); 
         } 
    
         return 0; 
        } 
    } 
    

如何使用:

"It's 4.45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4,45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4:45 O'clock now".DoubleParseAdvanced(':'); // will return 4.45 
+0

4:45应该等于4.75:P – Logman 2018-02-12 18:49:50

相关问题