如何在Rust中更改格式化程序的小数点分隔符?

时间:2017-06-15 20:01:43

标签: localization rust

以下功能导致“10.000”。我居住的地方意味着“一万”。

format!("{:.3}", 10.0);

我希望输出为“10,000”。

3 个答案:

答案 0 :(得分:4)

由于标准库没有此功能(数字格式的本地化),您只需用逗号替换点:

fn main() {
    println!("{}", format!("{:.3}", 10.0).replacen(".", ",", 1));
}

还有其他方法可以做到这一点,但这可能是最直接的解决方案。

答案 1 :(得分:4)

在Rust标准库中不支持国际化(i18n)或本地化(l10n)。

有几个原因,没有特别的顺序:

  1. 依赖于语言环境的输出应该是有意识的选择,而不是默认选择
  2. i18n和l10n比仅格式化数字要复杂得多,
  3. Rust std的目标是小。
  4. format!机制将用于编写JSON或XML文件。您真的不希望最终得到格式不同的文件,具体取决于编码它的机器的区域设置。这是灾难的秘诀。

    在运行时检测语言环境也是不友好的优化。突然之间,您无法在编译时(甚至部分)预先计算内容,甚至无法知道在编译时要分配哪个大小的缓冲区。

    这与可疑的用处有关。日期和数字可以说是重要的,但是这种美国与英国的格式化战争最终会在海洋中下降。一位法国语法小学生肯定会理解这个数字的格式是典型的法语格式......但如果周围的文字是英文的话,那对她来说是无济于事的(我们法语在教学/学习外语方面非常糟糕)。区域设置应该影响语言选择,排序顺序等...仅仅改变数字的格式是没有意义的,所有应该随之切换,这需要更严格的支持(检查gettext为一个提供良好 base 的C库。

    基于对主机语言环境的区域设置的检测,并且它对整个过程是全局的,在这个多线程Web服务器时代,它也是非常可疑的架构选择。想象一下,如果Facebook在欧洲以瑞典语提供服务只是因为它的数据中心正在那里运行。

    最后,所有这些语言/日期/ ...支持都需要大量的数据。 ICU内嵌了几十(或几百?)MB的此类数据。这会使std的大小爆炸,并使其完全不适合嵌入式开发;无论如何,这可能并不在乎。

    当然,如果你只选择支持少数几种语言,你可以大大减少这种情况......这是将其置于标准库外的另一个理由。

答案 2 :(得分:1)

这不是宏class ViewController: UIViewController { var keyboardOnScreen = false @IBOutlet weak var searchBar: UISearchBar! override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: .UIKeyboardWillHide, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardDidShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidHide), name: .UIKeyboardDidHide, object: nil) searchBar.delegate = self } } extension ViewController: UISearchBarDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } func keyboardWillShow(_ notification: Notification) { if !keyboardOnScreen { view.frame.origin.y -= keyboardHeight(notification) } } func keyboardWillHide(_ notification: Notification) { if keyboardOnScreen { view.frame.origin.y += keyboardHeight(notification) } } func keyboardDidShow(_ notification: Notification) { keyboardOnScreen = true } func keyboardDidHide(_ notification: Notification) { keyboardOnScreen = false } private func keyboardHeight(_ notification: Notification) -> CGFloat { let userInfo = (notification as NSNotification).userInfo let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue return keyboardSize.cgRectValue.height } private func resignIfFirstResponder(_ textField: UITextField) { if textField.isFirstResponder { textField.resignFirstResponder() } } @IBAction func userDidTapView(_ sender: AnyObject) { resignIfFirstResponder(textField) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) } } 的作用。此选项应由Rust处理。不幸的是,我的搜索引导我得出Rust不处理语言环境的结论(但是?)。

有一个库rust-locale,但它们仍处于alpha状态。