Qt 国际化(本地化)数值-QLocale

前言

在应用程序国际化语言中,不仅仅是文字的翻译国际化,有的还需要做数值的本地化。在【控制面板-时钟和区域-区域】中可以更改数字格式,比如说一般的国家使用【.】作为小数点,但是也有其他国家(比如俄罗斯)使用【,】作为小数点。分隔符合不一样,这就可能导致应用程序在其他国家区域不能正常打开使用。

Qt 国际化(本地化)数值-QLocale_第1张图片

数值本地化-QLocale

在Qt中有一个类专门用作数值和字符串本地化转换的,那就是QLocale.

The QLocale class converts between numbers and their string representations in various languages.

QLocale类在不同语言中的数字及其字符串表示之间进行转换。
1 QLocale的构造
QLocale is initialized with a language/country pair 
in its constructor and offers number-to-string 
and string-to-number conversion functions similar to those in QString.

QLocale在其构造函数中使用语言/国家对进行初始化,
并提供类似于QString中的数字到字符串和字符串到数字的转换函数。

Qt 国际化(本地化)数值-QLocale_第2张图片
QLocale的构造有4种方式,其中常用的应该是第二、第三种。下面介绍其中的两种构造方式:

方式1:使用区域名称进行构造

  QLocale chinese("zh-CN");
  QLocale korean("ko");
  QLocale swiss("de_CH");

方式2:使用语言(枚举类型)和国家(枚举类型)进行构造

  QLocale egyptian(QLocale::Arabic, QLocale::Egypt);
  QString s1 = egyptian.toString(1.571429E+07, 'e');
  QString s2 = egyptian.toString(10);

  double d = egyptian.toDouble(s1);
  int i = egyptian.toInt(s2);

QLocale的应用

在应用时,先了解两个主要的静态函数,一个是QLocale QLocale::system(),另外一个是void QLocale::setDefault(const QLocale &locale)

1)先看看system函数

它返回初始化为系统区域设置的QLocale对象。

在Windows和Mac上,此语言环境将使用系统配置面板中指定的十进制/分组字符和日期/时间格式。

Returns a QLocale object initialized to the system locale.
On Windows and Mac, this locale will use the decimal/grouping characters and date/time formats specified in the system configuration panel.

我们可以使用QDebug打印看看这个函数,头文件需要加上
QLocaleQDebug

 qDebug() <<"sys-Lang: " << QLocale::system().language()<<
               "sys-country"  << QLocale::system().country() <<
              "sys_decimal"  << QLocale::system().decimalPoint();
               //   sys-Lang:  QLocale::Language(Chinese) sys-country QLocale::Country(China) sys_decimal '.'
             

具体结果如下:包含了系统区域设置的数值分隔符等信息。
Qt 国际化(本地化)数值-QLocale_第3张图片
可以再做个试验,把区域格式更改位【俄语(俄罗斯)】,把小数点.更改为逗号, ;再运行看一下结果,确实也更改了。

Qt 国际化(本地化)数值-QLocale_第4张图片
在这里插入图片描述

2)接着看看 setDefault(const QLocale &locale)

该函数介绍如下:
将全局默认区域设置为locale。当构造不带参数的QLocale对象时,将使用这些值。如果未调用此函数,则使用系统的区域设置。

警告:在多线程应用程序中,默认语言环境应该在应用程序启动时设置,在创建任何非gui线程之前。

Sets the global default locale to locale. These values are used when a QLocale object is constructed with no arguments. If this function is not called, the system's locale is used.
Warning: In a multithreaded application, the default locale should be set at application startup, before any non-GUI threads are created.

setDefalut的使用 ,案例1

     bool ok;
     double d;

     QLocale::setDefault(QLocale::C);
     d = QString("1234,56").toDouble(&ok);   // ok == false
     if(ok){
         qDebug() << "C, " << d;
     }
     d = QString("1234.56").toDouble(&ok);   // ok == true, d == 1234.56
     if(ok){
         qDebug() << "C. " << d;
     }
     QLocale::setDefault(QLocale::German);
     d = QString("1234,56").toDouble(&ok);   // ok == false
     if(ok){
         qDebug() << "German, " << d;
     }
     d = QString("1234.56").toDouble(&ok);   // ok == true, d == 1234.56
     if(ok){
         qDebug() << "German. " << d;
     }

结果:

C.  1234.56
German.  1234.56

setDefalut的使用 ,案例2

//先看看系统,目前是中文简体的,小数点分割符号是.
    qDebug() <<"sys-Lang: " << QLocale::system().language()<<
                  "sys-country"  << QLocale::system().country() <<
                 "sys_decimal"  << QLocale::system().decimalPoint();
     bool ok;
     double d;

     //俄罗斯语 使用的小数点分割符号是,
     QLocale::setDefault(QLocale(QLocale::Russian, QLocale::Russia));
     d = QString("1234,56").toDouble(&ok);   //使用的是system的QLocale ok == false
     if(ok){
         qDebug() << "Russian, " << d;
     }
     d = QString("1234.56").toDouble(&ok);   // ok == true, d == 1234.56
     if(ok){
         qDebug() << "Russian. " << d;
     }

     QLocale le;  //构造一个不带任何参数的QLocale

     QString s1 = "1234,56";
     QString s2 = "1234.56";
     d = le.toDouble(s1, &ok); //使用的是le(也就是setDefault)的QLocale ok == true
     if(ok){
         qDebug() << "Russian-le, " << d;
     }
     d = le.toDouble(s2, &ok);   // ok == false
     if(ok){
         qDebug() << "Russian-le. " << d;
     }

结果:

sys-Lang:  QLocale::Language(Chinese) sys-country QLocale::Country(China) sys_decimal '.'
Russian.  1234.56
Russian-le,  1234.56

总结一下:直接使用 d = QString(“1234,56”).toDouble(&ok);,这里默认使用的是system()中的数据格式设置。而d = le.toDouble(s1, &ok);使用的是setDefault中的数据格式设置,前提一定是le是无参的QLocale构造对象。请认真查看setDefault函数的简介描述

3)QLocale将QString转数值
     bool ok;
     double d;

     QLocale c(QLocale::C);
     d = c.toDouble( "1234.56", &ok );  // ok == true, d == 1234.56
     if(ok){
         qDebug() << "C-1234.56  " << d;
     }
     d = c.toDouble( "1,234.56", &ok ); // ok == true, d == 1234.56
     if(ok){
         qDebug() << "C-1,234.56  " << d;
     }
     d = c.toDouble( "1234,56", &ok );  // ok == false
     if(ok){
         qDebug() << "C-1234,56  " << d;
     }


     QLocale german(QLocale::German);
     d = german.toDouble( "1234,56", &ok );  // ok == true, d == 1234.56
     if(ok){
         qDebug() << "German-1234,56  " << d;
     }
     d = german.toDouble( "1.234,56", &ok ); // ok == true, d == 1234.56
     if(ok){
         qDebug() << "German-1.234,56  " << d;
     }
     d = german.toDouble( "1234.56", &ok );  // ok == false
     if(ok){
         qDebug() << "German-1234.56  " << d;
     }
     d = german.toDouble( "1.234", &ok );    // ok == true, d == 1234.0

     if(ok){
         qDebug() << "German-1.234  " << d;
     }

结果:

C-1234.56   1234.56
C-1,234.56   1234.56
German-1234,56   1234.56
German-1.234,56   1234.56
German-1.234   1234

说明一下:

QLocale::CC”区域在行为上与英语/美国相同。
The "C" locale is identical in behavior to English/UnitedStates.
QLocale::German 小数点分隔符号是,   千位分隔符合是.

你可能感兴趣的:(Qt,qt,开发语言)