在应用程序国际化语言中,不仅仅是文字的翻译国际化,有的还需要做数值的本地化。在【控制面板-时钟和区域-区域】中可以更改数字格式,比如说一般的国家使用【.】作为小数点,但是也有其他国家(比如俄罗斯)使用【,】作为小数点。分隔符合不一样,这就可能导致应用程序在其他国家区域不能正常打开使用。
在Qt中有一个类专门用作数值和字符串本地化转换的,那就是QLocale.
The QLocale class converts between numbers and their string representations in various languages.
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中的数字到字符串和字符串到数字的转换函数。
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::system(),另外一个是void QLocale::setDefault(const QLocale &locale)
它返回初始化为系统区域设置的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打印看看这个函数,头文件需要加上
QLocale 和 QDebug
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 '.'
具体结果如下:包含了系统区域设置的数值分隔符等信息。
可以再做个试验,把区域格式更改位【俄语(俄罗斯)】,把小数点.更改为逗号, ;再运行看一下结果,确实也更改了。
该函数介绍如下:
将全局默认区域设置为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函数的简介描述。
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::C “C”区域在行为上与英语/美国相同。
The "C" locale is identical in behavior to English/UnitedStates.
QLocale::German 小数点分隔符号是, 千位分隔符合是.