使用Convert.ToDouble转换字符串为double时保留前导零的方法问询
问题根因
你碰到的0,8转换后得到-8的现象,和前导零没有任何关系,本质是字符串解析时的区域格式不匹配:
- 如果当前线程的区域设置里,逗号
,是千位分隔符、点.才是小数分隔符,Convert.ToDouble("0,8")会直接把逗号当作千位分隔符忽略,解析出来的数值就是8,乘以-1后自然得到-8。 - 只有当区域设置中逗号是小数分隔符时,
"0,8"才会被正确解析为0.8,乘以-1后得到-0.8,不会出现你描述的问题。
解决方案
如果你的业务场景中输入的逗号就是用来表示小数的,转换时需要明确指定匹配的区域规则:
// 示例:指定使用逗号作为小数分隔符的德语区域规则做解析 var parseCulture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); double num = Convert.ToDouble(tbValue.Text, parseCulture); // 转字符串输出时如果需要固定格式可以指定格式字符串,比如保留1位小数 tbValue = (num * -1.0).ToString("0.0", parseCulture);
如果需要输出时统一用.作为小数分隔符,可以把ToString的第二个参数换成System.Globalization.CultureInfo.InvariantCulture。
关于保留前导零的说明
Convert.ToDouble的作用是把字符串转为数值类型,数值本身不存在“前导零”的概念,前导零是数值转字符串输出阶段的格式需求,你只需要在调用ToString时指定对应的格式字符串即可,比如"0.##"格式就会自动保留整数位的前导零,同时最多保留2位小数。
内容的提问来源于stack exchange,提问作者user15339638
相关产品推荐
相关产品推荐

