求助:如何在Blockly实现英文数字转阿拉伯数字(支持大数及两位小数)
用Blockly实现英文数字转阿拉伯数字(支持小数)
一、核心逻辑拆解
把输入的英文数字拆成整数部分和小数部分分别处理,最后合并结果:
- 整数部分按「million(百万)、thousand(千)、hundred(百)」的层级拆分计算
- 小数部分直接转成两位数字后除以100,得到对应小数
二、新手友好的Blockly配置步骤
1. 准备基础组件
- 从「文本」分类拖出文本输入块,用来让用户输入英文数字(比如
four thousand three hundred twenty seven point five six) - 从「变量」分类点击「创建变量」,添加三个变量:
总数值、整数部分值、小数部分值
2. 拆分输入文本
- 用「文本」分类的拆分文本块,把输入文本按
point拆分,得到两个片段:- 第一个片段是整数部分的英文,赋值给临时变量
整数文本 - 第二个片段是小数部分的英文(如果没有小数则为空),赋值给临时变量
小数文本
- 第一个片段是整数部分的英文,赋值给临时变量
3. 整数部分转换(核心)
整数部分需要处理不同量级的单位,用嵌套判断和计算块实现:
- 先做一个「基础数字映射」:用如果-那么块判断,比如输入
one返回1,twenty five返回25,覆盖0到99的所有英文表述 - 处理
hundred:比如three hundred forty five→(基础映射(three) * 100) + 基础映射(forty five) - 处理
thousand:把文本按thousand拆分,前半部分数值×1000,加上后半部分的数值(比如four thousand three hundred twenty seven→基础组(four)*1000 + 基础组(three hundred twenty seven)) - 处理
million:同理,前半部分数值×1000000,加上后半部分的数值 - 把最终计算结果赋值给
整数部分值
4. 小数部分转换
- 用如果-那么块判断:如果
小数文本不为空,就把它转成基础数字(比如five six转成56),再除以100得到0.56,赋值给小数部分值;如果为空,小数部分值设为0
5. 合并并输出结果
- 用数学计算块把
整数部分值加小数部分值,赋值给总数值 - 从「输出」分类拖出输出块,把
总数值放进去,运行后就能看到对应的阿拉伯数字
三、偷懒的快速实现(用现成代码块)
如果不想拼复杂的判断块,直接用Blockly的「高级」分类里的运行JavaScript块,复制粘贴以下代码:
function textToNumber(text) { const numMap = { zero:0,one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9, ten:10,eleven:11,twelve:12,thirteen:13,fourteen:14,fifteen:15,sixteen:16, seventeen:17,eighteen:18,nineteen:19,twenty:20,thirty:30,forty:40,fifty:50, sixty:60,seventy:70,eighty:80,ninety:90,hundred:100,thousand:1000,million:1000000 }; const parts = text.toLowerCase().split('point'); const intText = parts[0].trim(); const decText = parts.length>1 ? parts[1].trim() : ''; // 计算整数部分 let intVal = 0; let current = 0; intText.split(' ').forEach(word => { if(word === 'hundred'){ current *= numMap[word]; intVal += current; current = 0; }else if(word === 'thousand'){ current += intVal; intVal = current * numMap[word]; current = 0; }else if(word === 'million'){ current += intVal; intVal = current * numMap[word]; current = 0; }else{ current += numMap[word]; } }); intVal += current; // 计算小数部分 let decVal = 0; if(decText){ decText.split(' ').forEach(word => { decVal = decVal *10 + numMap[word]; }); decVal /= 100; } return intVal + decVal; } // 把下面的字符串换成你的文本输入块输出 const input = "four thousand three hundred twenty seven point five six"; const result = textToNumber(input); console.log(result);
- 把代码里的
input替换成之前的文本输入块,再用输出块打印result即可
四、测试案例
- 输入:
four thousand three hundred twenty seven→ 输出:4327 - 输入:
one million two hundred thirty four thousand five hundred sixty seven point eight nine→ 输出:1234567.89 - 输入:
nine hundred ninety nine million nine hundred ninety nine thousand nine hundred ninety nine point nine nine→ 输出:999999999.99
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

