C语言数值格式化和解析中的本地化小数点

C语言不支持千位分隔符,只支持小数点。

  1. 字符串解析整数atoi、atol、atoll、strtol、strtoll、strtoul、strtoull、strtoimax、strtoumax
  2. 扫描函数scanf、fscanf、sscanf使用%d%i%u%o%x处理整数
  3. 格式化函数printf、fprintf、sprintf、snprintf使用%d%i%u%o%x处理整数

以上函数与区域设置无关,不受setlocale影响。

  1. 字符串解析浮点数atof、strtof、strtod、strtold
  2. 扫描函数scanf、fscanf、sscanf使用%a%e%f%g处理浮点数(double使用%la%le%lf%lg)
  3. 格式化函数printf、fprintf、sprintf、snprintf使用%a%e%f%g处理浮点数

以上函数小数点受setlocale影响。

如果需要获取小数点字符串的话,个人推荐使用sprintf(buf, "%.1f", 1.5);格式化一个1.5,然后截掉开头的1和结尾的5,就是小数点字符串了。找到小数点字符串之后,就可以对其它数据中的小数点进行处理了。实际上小数点可以是包含任何字符的字符串,但一定不包含数字字符。

不建议使用localeconv()->decimal_point,主要是不同C运行库对这个字符串的使用并不一致,有的C运行库使用整个字符串,有的C运行库只使用第一个字符。事实上Windows支持1~3个Unicode字符,对应若干个8位字符,但C运行库仅使用第一个8位字符decimal_point[0]或第一个Unicode字符_W_decimal_point[0];而Linux则支持1个Unicode字符,对应若干个8位字符,而且C运行库使用整个decimal_point字符串。

发布了29 篇原创文章 · 获赞 1 · 访问量 3398

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103821109