【问题标题】:Locale dependent string to number conversion依赖于语言环境的字符串到数字的转换
【发布时间】:2022-01-26 14:45:03
【问题描述】:

我想将本地化字符串转换为数字;包括小数分隔符和/或千位分隔符。它适用于只有“。”的字符串。作为小数分隔符,但在以下情况下不起作用,即返回 nil

  1. “21,1”(预期:21.1)
  2. “1,231.0”(预期:1231.0)
  3. “1.000.101,044”(预期:1000101.044)

问题是我不知道事先设置了哪个语言环境,所以转换必须是通用的。

是否有依赖于语言环境的字符串到数字的转换?

【问题讨论】:

  • 你怎么理解tonumber(1.001)应该是1001还是1001/1000?点可能是千位分隔符或小数点,具体取决于语言环境。

标签: lua type-conversion


【解决方案1】:

有点——没有特定的转换函数可以接受语言环境,但可以使用os.setlocale为整个过程设置它:

assert(os.setlocale("de.utf8"))
print(tonumber("1,2"))

这会将 C 语言环境设置为德语 (UTF-8),假设它已安装在系统上,这将影响所有转换,还会影响格式、排序规则、时间等。您必须使用 os.setlocale(name, "numeric") 来影响只有数字格式和解析规则。

您可以多次执行此操作,直到转换成功。

【讨论】:

  • 我在stackoverflow.com/questions/35003914/… 中读过并尝试过,但也许这只是lua.org/cgi-bin/demo 上的解释器错误。
  • 不幸的是,这只是部分工作,即print(tonumber("1.111,2")) 返回nil。我想我将不得不使用一些变通方法来重新格式化我得到的任何输入并强制执行一个语言环境。
  • 啊,这取决于系统上安装的语言环境,不能保证演示会拥有它(而且似乎我的名字是不正确的,至少在 Unix 的情况下)。它不是独立于平台的。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
相关资源
最近更新 更多