• QtQt QString toDouble 失败


    相关资料:

    https://blog.csdn.net/Time2017/article/details/126900752

    1、问题:

    欧洲语言的操作系统中,调用QLineEdit.Text().toDouble(),产生错误;

    例如:“50,000”转为double后,结果是0;

    2、原因一:德国等欧洲国家,小数点是用逗号表达,千分隔号用小数点表示:

    如中文的“60000.123”,德语则显示为“60.000,123”

    https://docs.oracle.com/cd/E19253-01/819-0402/overview-48/index.html

    如下图,内部设置的是“60.00”,但QLineEdit.Text()获得的是“60,00”

    3、原因二:QString.toDouble内部采用的是英文解析,导致“60,00”转double时变为0;

    //QLocaleData::c()代表使用英文系统解析
    double QString::toDouble(bool *ok) const
    {
    return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
    }

    二、正确做法:
    1、QString转double,
    1-1、考虑本地语言环境的方式:

    auto systemLocale = QLocale::system();
    bool ok;
    double d = systemLocale.toDouble("60,000",&ok);
    if(ok)
    {
    //转换成功
    }
    1-2、仅考虑英文语言环境的方式:

    //转换失败
    bool ok;
    QString strTmp = "60,000";
    double tmpD = strTmp.toDouble(&ok);//double为0,ok为false
    2、double转QString:
    2-1、转为本地语言环境的字符串

    auto systemLocale = QLocale::system();//Italian
    auto systemLanguage = systemLocale.language();
    QString d = systemLocale.toString(600000.123,'f',4);//输出“600.000,1230”
    2-2、转为英文环境的字符串

    QString str1 = QString("%1").arg(600000.123 , 0 , 'f' , 4);//输出“600000.1230”
    std::string str2 = SDStringUtils::StdStringFormat("%.3f",600000.123);//输出“600000.123”

  • 相关阅读:
    好文转贴(1) —— 程序员已死 & 程序员平庸or伟大,证据就在代码里&一些鲜为人知的编程事实
    django的两个学习资料
    django的两个学习资料
    POJ2418(BST)
    全局变量、函数原型和Guard macro
    POJ2754(八皇后)
    VC中Windows常用控件的创建和使用
    POJ1088(DP,DFS)
    超前引用
    POJ2715(Water)
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/16784739.html
Copyright © 2020-2023  润新知