delphi中formatFloat代码初探(在qt下实现floatformat的函数)
由于项目需要,需要在qt下实现floatformat的函数。之前写过一个,但是写得不好。决定重新写一个,参考delphi xe2下的实现。把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来。xe2下的代码在system.sysutils下,核心函数是InternalFloatToTextFmt。它有汇编的版本跟纯pascal的版本。汇编看不懂,参考的是纯pascal的版本。
整体流程是:
1)解析format格式化字符串
- Result := 0;
- DecimalSep := AFormatSettings.DecimalSeparator;
- //根据系统取得小数点的符号
- ThousandsSep := AFormatSettings.ThousandSeparator;
- //根据系统取得千分位的符号。这两个最好也通过系统API来取,如果要做国际化的话,这两个在不同的系统上是不一样的。
- if ValueType = fvCurrency then
- Temp := Currency(Value)
- else
- Temp := Extended(Value);
- if Extended(Temp) > 0 then
- AIndex := 0
- else
- if Extended(Temp) < 0 then
- AIndex := 1
- else
- AIndex := 2;
- SectionIndex := FindSection(AIndex);
- Section := ScanSection(SectionIndex); //这个主要是取得format的格式字符串,取得小数点,千分位的位置,还有是否显示科学计数法,取得填充0的位置。
这段代码主要是分析格式化字符串。这个可以直接参考代码翻译成C++的。
2)将浮点数转成十进制的数字,用的函数是 FloatToDecimal(FloatValue, Value, ValueType, Precision, Digits);
- TFloatRec = packed record
- Exponent: Smallint;
- //表示几位整数(100,对应的3)
- Negative: Boolean;
- //表示是否为负数
- Digits: array[0..20] of AnsiChar;
- //将浮点数中的数字取出来存到里面,如果是0.XXX的,第一个0不存。
- end;
C++的实现代码如下:
- result->negative = value < 0;
- if (fabs(value) < 1e-16)
- {
- result->exponent = 0;
- result->digits[0] = '\0';
- return;
- }
- if (result->negative)
- {
- value = abs(value);
- }
- GString strDigits = GString::number(value, 'f', 18);
- result->exponent = strDigits.indexOf("."); //算出小数点前的位数
- int nStrIndex = 0;
- if (value < 1) //小数前的那个0不算
- {
- result->exponent = 0;
- nStrIndex = 1;
- }
- int nIndex = 0;
- while (true) //把数字压入floatRec中
- {
- if (strDigits[nStrIndex] == QChar('.'))
- {
- nStrIndex++;
- continue;
- }
- if (nStrIndex > 19 || (nStrIndex >= strDigits.length()))
- {
- break;
- }
- result->digits[nIndex] = strDigits[nStrIndex].toLatin1();
- nStrIndex++;
- nIndex++;
- }
- if (result->exponent + decimals < 0)
- {
- result->exponent = 0;
- result->negative = false;
- result->digits[0] = 0;
- return;
- }
这段代码执行后,会根据小数位数进行截断,还有进行四舍五入。
- while true do
- begin
- Result.Digits[J] := #0;
- Dec(J);
- if J < 0 then
- begin
- Result.Digits[0] := '1';
- Inc(Result.Exponent);
- Exit;
- end;
- Inc(Result.Digits[J]);
- if Result.Digits[J] <= '9' then
- Exit;
- end;
- if (FormatLength = 0) or (GetCharIndex(Format, 0) = ';') or
- ((FloatValue.Exponent >= 18) and (not Scientific)) or
- (FloatValue.Exponent = $7FF) or (FloatValue.Exponent = $800) then
- if Unicode then
- Result := FloatToText(PWideChar(Buf), Value, ValueType, ffGeneral, 15, 0)
- else
- Result := FloatToText(PAnsiChar(Buf), Value, ValueType, ffGeneral, 15, 0)
- 这个可以直接调QSTring::num()来实现,将浮点数转成字符串
- else
- ApplyFormat;//这个函数来实现格式化,可以直接翻译成C++
http://blog.csdn.net/hpjx1987/article/details/25462807
delphi中formatFloat代码初探(在qt下实现floatformat的函数)的更多相关文章
- 在Delphi中使用ShellExecute(handle, 'open', PChar(fname),nil, nil, SW_HIDE)函数应注意的问题
在Delphi中使用ShellExecute(handle, 'open', PChar(fname),nil, nil, SW_HIDE)函数应注意的问题: 一.对一般vcl程序及isapi dll ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- Delphi 中Format的字符串格式化使用说明(转)
源:Delphi 中Format的字符串格式化使用说明(转) 一.Format函数的用法 Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Delphi中Form的position属性与代码自定义窗体位置
通过Form的Position属性可设置窗体的初始位置,如选择DesktopCenter为桌面中心,ScreenCenter为屏幕中心,等等. 这个属性在很多时候简化了程序代码. 但是,如果设置了po ...
- 初探Delphi中的插件编程
前言 我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结构.随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做一点修改都要重新编译,单个 ...
- 在delphi中执行javascript代码
有时做项目难免用到代码交叉调用,delphi中执行js就是一种,两种方法可用: 一.使用webbrower,比较麻烦 二.使用ScriptControl,简单方便: 1.首先 uses ComObj; ...
- 在Delphi中高效执行JS代码
因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用. 后面发现多次 ...
- VC++或QT下 高精度 多媒体定时器
在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码 ...
随机推荐
- 在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在 ...
- SharePoint 学习记事(三)
做一件事情,计划很重要,但是变化会将一切的付出付诸东流. 13年年底,领导想要调整资源,准备启动项目.于是我们召开了一个类似于启动会的资源筹备会.(处于低成本的考虑,部门领导想要共享日本组的两个做.n ...
- iOS-学习路线图(推荐)
在学习一个新的知识时,除了保持积极的态度.对知识的渴望,学习路线以及方法也是很重要的.在学习iOS的时候,遇到这样的情况,非常想去学习,提高,但是没有一个学习路线,不知道从哪里入手,该先学什么.在学什 ...
- java中的异常处理机制_finally的使用
finally总结: finally代码块:定义一定执行的代码 通常用于关闭资源或者某些一定执行的代码 实例1:finally功能演示 class FuShuException extends Exc ...
- 01_SpringMVC流程架构图
[组件说明] 以下组件通常使用框架提供实现: 1.DisPatcherServlet:前端控制器(不需要程序员开发) 用户请求到达前端控制器,它相当于MVC模式中的C(Controller),Disp ...
- width(),innerHTML(),outerHTML()
HTML代码: <div id="box"> <p>哈哈,随便写点内容</p> <p>删除的实例</p> <p&g ...
- 字符编码笔记:ASCII,Unicode和UTF-8【转载】
作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...
- Sqlserver循环嵌套
1.游标的状态,游标的开启游标的选择都是需要注意的. USE [ccnu] GO /****** Object: StoredProcedure [dbo].[P_ADD_DATA_XSBLHYCQK ...
- oracle expdp 无法导出SYS下特定TABLE
创建测试表: D:\app\product\\db_1>sqlplus "/as sysdba" SQL :: Copyright (c) , , Oracle. All r ...
- Sqlmap下载安装与基础命令使用
本文介绍一下Sqlmap的安装跟配置环境变量. 顺便附上一些常用的命令 SQLMAP-64位.Python 下载链接:http://pan.baidu.com/s/1c0D82fm 密码:d7ec P ...