相信大家在写程序的时候,一定有非常多的机会要将数值字数(numeric string)转成 int 或 float类型的值,但数值字数可能不是很干净,有时还会有千分位、货币符号、前后有空白、甚至不是10进制,这样转换就有点累,像千分位或货币符号以前我是用 Replace 将 , $ 等符号删除后再转换,但如果你是使用.Net Framework 2.0 以上其实就不用那么麻烦,内建就有功能帮你处理这些杂七杂八的东西,让我们来看看怎么做吧。
相信大家在写程序的时候,一定有非常多的机会要将数值字数(numeric string)转成 int 或 float类型的值,但数值字数可能不是很干净,有时还会有千分位、货币符号、前后有空白、甚至不是10进制,这样转换就有点累,像千分位或货币符号以前我是用 Replace 将 , $ 等符号删除后再转换,但如果你是使用.Net Framework 2.0 以上其实就不用那么麻烦,内建就有功能帮你处理这些杂七杂八的东西,让我们来看看怎么做吧。
使用 int.Parse 或 int.TryParse
没看错就是 int.Parse ,使用 int.Parse 就可以做到含有千分位、货币符号的 String 转型。
可能你会说我骗你,那想必没有看看 Parse 这个方法(Method) 的其他参数,Parse 其中有一个参数 System.Globalization.NumberStyles 枚举类型(Enum)就是用来声明说传入的 string 的样允许式,而NumberStyles的成员如下表:
以下是组合成员:
这只是简表,详细内容请看[MSDN]NumberStyles 枚举类型。
而 int.Parse 默认使用的 NumberStyles 是 Integer,Integer 只允许前后有空白与加减的模式,所以传入其他。
还有其他如 decimal.Parse、float.Parse、byte.Parse、short.Parse 等等数字型的 ValueType 都支持使用 NumberStyles,因为其实他们都是用同一只 Class 来处理转换,只是使用的 NumberStyles 不同而已,如 decimal.Parse 默认使用的值为 NumberStyles.Currency 。
而 TryParse 是在转换时比较好的方法,因为 Parse 是值的格式不正确就会丢出 Exception 如果程序没有写好可能会使程序关闭,但 TryParse 就不一样,值的格式不正确只有不回传转换后的值而已,不会造成大太的灾难(不过也不一定,因为可能原本遇期用 TryParse 接收转换值的变量一定会有值,但转换失败又没有做其他的处理,最后可能还是产生了 NullReferenceException,要避免这样的问题发生,可以参考防御式编程(Defensive programming)的精神)。
使用范例
//含有千分位 int value1 = int.Parse("1,000,000", NumberStyles.AllowThousands); int value2 = (int)decimal.Parse("1,000,000"); //当然用decimal.Parse也可以,只是要转型 //但有小数就不能用int.Parse会失败 int value3 = (int)decimal.Parse("1,000,000.50", NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint); //有货币符号也可以,但$与数字不能分开,但使用电脑的文化设定 int value4 = int.Parse("NT$1,000,000", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowThousands); //也可以使用不同国家的文化设定 int value5 = int.Parse("$1,000,000", NumberStyles.Any, CultureInfo.GetCultureInfo("en")); //美国 int value6 = int.Parse("¥1,000,000", NumberStyles.Any, CultureInfo.GetCultureInfo("ja")); //日本 //指数 int value7 = int.Parse("1E+6", NumberStyles.AllowExponent); //括弧 int value8 = int.Parse("(1,000,000)", NumberStyles.AllowParentheses | NumberStyles.AllowThousands); //16进制 int value9 = int.Parse("F4240",NumberStyles.HexNumber); //前后空白 int value10 = int.Parse(" 1000000 ",NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite); //但百分值不支持,要额外处理 int str = "10.5%"; if (str.IndexOf(‘%‘)>-1) { int value11 = decimal.Parse(str.TrimEnd(new char[] {‘%‘,‘ ‘})) / 100M; } //2或8进制,要使用另一个 Method int value12 = Convert.ToInt32("11110100001001000000", 2); int value13 = Convert.ToInt32("3641100", 8); //如果懒惰可以这样写,只是性能会差一点点 int value14 = (int)decimal.Parse("1,000,000", NumberStyles.Any);
参考数据
[MSDN]NumberStyles 枚举类型
[Wikipedia]Defensive programming
原文:大专栏 [C#]简单快速将各种数值字数转成数字(string to int)