• 11256阅读
  • 21回复

数字显示千分位 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-01
QString numberToCurrencyString(double f)
{
    QString strF = QString::number(f, 'f', 2);
    int pos = strF.size() - 6;
    while (pos > 0)
    {
        strF = strF.insert(pos, QChar(','));
        pos -= 3;
    }
    return strF;
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线kimtaikee

只看该作者 1楼 发表于: 2012-08-01
更直接的作法
  1. QString str;
  2. str = tr("%L1").arg(12345);

离线XChinux

只看该作者 2楼 发表于: 2012-08-01
引用第1楼kimtaikee于2012-08-01 22:24发表的  :
更直接的作法
  1. QString str;
  2. str = tr("%L1").arg(12345);


这个受locale设置的影响,还可能出现科学计数法,不知道boost里面有没有现成方法可用,不过也简单。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线heksn

只看该作者 3楼 发表于: 2012-08-02
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
str = QString("%1 %L2 %L3")
         .arg(12345)
         .arg(12345)
         .arg(12345, 0, 16);
// str == "12345 12,345 3039"
离线XChinux

只看该作者 4楼 发表于: 2012-08-02
科学计数法的问题。
你将数字变得大些,就会看出来了。要求不能显示成科学计数法。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lyjbbq

只看该作者 5楼 发表于: 2012-08-17
mark
离线cfxks1989

只看该作者 6楼 发表于: 2012-10-09
坐标
离线cfxks1989

只看该作者 7楼 发表于: 2013-01-11
原来也有过这个需求。记得但是是用C语言编写的:比较复杂
QString FtpClientWindow::format_thousands_separator(qint64 val)
{
        static char buf[16][16];
        static int  c = 0;
        long m, n = 0;
        char* p = &buf[c++ % 16][15];
        *p = '\0';

        do
          {
            m = val % 10;
            val = val / 10;
            *--p = '0' + m;
    
            if (val && !(++n % 3))
              *--p = ',';
        
           } while(val);
          QString qOut=QString(p);
          return qOut;
}
离线fzx374

只看该作者 8楼 发表于: 2013-01-11
俺也回复一个
我是做金融的,业余爱好Qt+mysql。我经常用此。
double m = 12345;
QString str = QString("%L1").arg(m,0,'f',2);  //2控制小数位,12,345.00
m =123456789.12;
str=QString("%L1").arg(m,0,'f',2);  //123,456,789.12

QQ:563644585
离线XChinux

只看该作者 9楼 发表于: 2013-01-11
Re:俺也回复一个
引用第8楼fzx374于2013-01-11 10:45发表的 俺也回复一个 :
我是做金融的,业余爱好Qt+mysql。我经常用此。
double m = 12345;
QString str = QString("%L1").arg(m,0,'f',2);  //2控制小数位,12,345.00
m =123456789.12;
str=QString("%L1").arg(m,0,'f',2);  //123,456,789.12
.......

对金额敏感的,要求必须精确的情况下,你们通常用什么计算方式?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fzx374

只看该作者 10楼 发表于: 2013-01-28
回 9楼(XChinux) 的帖子
用double类型吧,是不是控制好有效数字位数就可以了?你的金额敏感是什么意思呢?
离线XChinux

只看该作者 11楼 发表于: 2013-01-28
就是金额类,小数部分必须正确。
就连Excel计算中,也有将比如 5.452345识计算成5.4523449999999999999的情况,我只是举个例子。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fzx374

只看该作者 12楼 发表于: 2013-01-29
回 11楼(XChinux) 的帖子
印象中同你的Excel例子一样,这是由c++决定的。即便这样,我感觉对结果并没有太大影响。
离线XChinux

只看该作者 13楼 发表于: 2013-01-29
比如说给客户出报表,结果差一分钱,和人工算出来的不一样,那项目验收就通不过,所以必须解决。以前遇到一个案例,计算结果就是不对,而且GCC和MSVC的麦结果也不一样,最后没办法加了调整数才暂时解决。所以按通常算法的话只能尽量调整计划算公式和变浮点数为整数运算。再后来干脆月GMP来计算所有此类问题。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fzx374

只看该作者 14楼 发表于: 2013-01-31
回 13楼(XChinux) 的帖子
我一朋友在用Excel表计算税款时存在类似问题,因为四舍五入问题,合计相差一分钱,税务部门通不过。朋友求助于我,我让其先四舍五入,精确到分,然后合计,解决之。
你可以参考访方案
离线XChinux

只看该作者 15楼 发表于: 2013-01-31
用GMP库了,省事。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zheguzai

只看该作者 16楼 发表于: 2013-09-25
学习了,
离线ysu533

只看该作者 17楼 发表于: 2014-04-09
回 XChinux 的帖子
XChinux:就是金额类,小数部分必须正确。
就连Excel计算中,也有将比如 5.452345识计算成5.4523449999999999999的情况,我只是举个例子。 (2013-01-28 15:59) 

金融计算全是整数计算, 人工编程控制精度和舍入算法. 浮点数别说5.452345识计算成5.4523449999999999999. 比如录入整数3, 结果显示2.999999999(具体多少个9忘了), 才看起来诡异呢. 当时给手下解释了很久为什么
离线yedongguo

只看该作者 18楼 发表于: 2014-12-08
        
离线圣域天子

只看该作者 19楼 发表于: 2014-12-12
你们有没有数字金额转大写的财务开票字符串的呢?
离线futureq

只看该作者 20楼 发表于: 09-23
Qstring 自带了sprintf 函数,用%.3f即可
离线angelus

只看该作者 21楼 发表于: 09-24
金额计算我当时是直接自己写了一个简单的QDecmail类型,重载了运算符实现的
快速回复
限100 字节
 
上一个 下一个