在Delphi中如何正确提取输入数字的千位、百位、十位及个位数值
Delphi 提取整数各数位的修正方案
原有代码的问题说明
- 语法类错误:Delphi 中执行变量赋值必须使用
:=运算符,原代码里iNumOnes = iNum DIV 1误用了用于逻辑相等判断的=符号,会直接触发编译报错。 - 逻辑类缺陷:仅靠整除运算无法拆分出单独的数位,运算结果会连带保留低位的数值:
- 原代码中
iNumTens := iNum DIV 10对155运算的结果是15,并非期望的十位数值5 - 原代码中个位提取用
DIV 1等于直接返回整个原数,完全没有剥离高位数值的效果 - 原代码未定义、未实现千位的提取逻辑,和需求不匹配
- 原代码中
正确的数位提取逻辑
提取固定位置数位的通用规则是:先将原数整除到目标数位对应的量级,再与10做取模运算剥离所有高位数值:
- 千位:将原数整除1000后,对10取余
- 百位:将原数整除100后,对10取余
- 十位:将原数整除10后,对10取余
- 个位:直接将原数对10取余
注意:如果输入内容可能为负整数,需要先对原数取绝对值再做数位计算,否则取模返回的结果会携带负号,和实际数位值不符。
修正后的可运行代码
var iNum, iNumThou, iNumHun, iNumTens, iNumOnes: Integer; begin // 先取输入数值的绝对值,规避负数取模的符号问题 iNum := Abs(StrToInt(edtInput.Text)); // 千位:先整除1000,再取模剥离更高位 iNumThou := (iNum div 1000) mod 10; // 百位:先整除100,再取模剥离更高位 iNumHun := (iNum div 100) mod 10; // 十位:先整除10,再取模剥离更高位 iNumTens := (iNum div 10) mod 10; // 个位:直接取模10 iNumOnes := iNum mod 10; end;
内容的提问来源于stack exchange,提问作者Renier
相关产品推荐
相关产品推荐

