如何在 Delphi 中将浮点值显示为科学参数
Posted
技术标签:
【中文标题】如何在 Delphi 中将浮点值显示为科学参数【英文标题】:How to display a floating point value as scientific parameter in Delphi 【发布时间】:2011-02-14 13:57:13 【问题描述】:我们经常需要以带有乘数和单位的科学形式显示浮点值,例如 1500 V(伏特)的值将显示为 1.5 kV。 1e-4 V 的非常小的电压将显示为 100 uV。多年来,我们一直使用内部创建的例程来进行这种浮点到字符串的转换,但最近我想知道这种方法是否更普遍可用?
【问题讨论】:
如果我是你,我会像你一样继续前进。您不太可能找到完全符合您要求的东西。 我建议使用 U+00B5 MICRO SIGN (µ) 而不是 U+0075 LATIN SMALL LETTER U (u)。 不过,我完全同意@David:没有理由不自己编写这样的函数。 @Andreas 和@David - 谢谢,我也这么想。布赖恩。 按照规范方法,1e-4 V 应归一化为 0.1 mV 【参考方案1】:我正在使用这个 FormathWithPrefix 函数,但对对数知之甚少... :)
支持SI prefixes范围!
function FormathWithPrefix(n: double; decimals: integer): string;
var
index: integer;
const
Prefixes: array[-9..9]of string = ('<', 'y', 'z', 'a', 'f', 'p', 'n', 'µ', 'm', '',
'k','M', 'G', 'T', 'P', 'E', 'Z', 'Y', '>');
begin
index := round((Ln(n) / Ln(10) - 1) / 3);
if index > 9 then
index := 9;
if index < -9 then
index := -9;
result := (FloatToStrF(n / Exp(index * 3 * ln(10)) , ffFixed, 20, decimals) + Prefixes[index]);
end;
begin
n := 1500;
Writeln(FormathWithPrefix(n, 1),'V');
【讨论】:
不错。与我们所做的类似!【参考方案2】:如果您的目标是让例程更加“原生”,您可以查看 ConvUtils 和 StdConvs 单元,看看您是否可以将例程基于这些单元提供的转换函数。 (不确定这些单位是什么时候引入的。快速谷歌搜索建议 Delphi 6)
但这不一定对您有多大帮助。 (取决于您要实现的目标)
【讨论】:
我去看看 - 我认为可能存在的类似于绝地武士的东西。我知道 Turbopower 几年前在其科学单位中进行了很多转换,但当然都是 pre-unicode。【参考方案3】:在这里试试:http://www.delphibasics.co.uk/RTL.asp?Name=FloatToStrF
特别是这个:`ShowMessage('Using 8,4 = '+FloatToStrF(amount1, ffFixed, 8, 4)); 表明你可以使用这样的东西:
var
Answer:string;
thevolts:double;
begin
Answer:= FloatToStrF(thevolts, ffFixed, 8, 4)+' kV'
end;
【讨论】:
Brian 知道如何将浮点数转换为字符串。他想要一个根据值的大小选择 V 或 µV 的例程! @Dave 有一点聪明才智,他可以用我提供的东西和简单的例程来测试值的数量级(位数)。我可以并且假设这对我们很多人来说都很简单。 LOL ...hmmm if value > xxx then V else if 他已经按照你说的做了。这是他问题的核心。以上是关于如何在 Delphi 中将浮点值显示为科学参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在JavaScript中将值为1.10的数字转换为无损浮点值[重复]
在没有科学计数法的 SQL Server 中将 float 转换为 varchar