65.9K
CodeProject 正在变化。 阅读更多。
Home

XSLT 数字到字符串转换

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2008 年 7 月 7 日

CPOL

3分钟阅读

viewsIcon

40294

downloadIcon

246

一个用于数字位值字符串表示的 XSLT 转换

引言

我们都见过许多用不同语言编写的应用程序,用于将数字数据转换为其等效的位值表示形式。 例如:123 表示为“一百二十三”。 我正在学习 XSLT,并编写了这个应用程序来执行从 XML 到 HTML 的数字到位值转换。 这个转换文件使用了 XSLT 的许多特性,例如用于字符串操作、格式化和数字转换的内置方法。

背景

不熟悉印度传统编号系统的人可能会觉得这很有挑战性。 印度、巴基斯坦和孟加拉国使用的系统基于两位小数的独特分组,而不是西方常见的三位小数。 在印度的商业交易中,人们很可能会遇到阿拉伯、克罗尔和拉克这些数字术语(见下表),尽管列出的更高的数字很少使用。 这些更常用的词经常组合使用,例如,一个拉克克罗尔,即 1012,或一万亿。 Padma 和 Kharab 这两个术语有时在印地语中使用。

印度独特的数字系统

术语 数字 零的个数 西方系统(短标度)

拉克 (lac) 1,00,000

5

100000(10 万)

克罗尔 1,00,00,000

7

10,000,000(一千万)

阿拉伯 1,00,00,00,000

9

1,000,000,000(十亿)

卡拉布 1,00,00,00,00,000

11

100,000,000,000(1000 亿)

尼尔 1,00,00,00,00,00,000

13

10,000,000,000,000(10 万亿)

帕德玛 1,00,00,00,00,00,00,000

15

1,000,000,000,000,000(一千兆)

尚克 1,00,00,00,00,00,00,00,000

17

100,000,000,000,000,000(100 千兆)

玛哈-尚克 1,00,00,00,00,00,00,00,00,000

19

10,000,000,000,000,000,000(10 秭)

来源

Using the Code

按照下面指定的格式制作你的 XML 文档。 将样式表引用添加到你的 XML,然后在网络浏览器中打开该 XML(在此 XML 中,# 代表一个数字)

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="TransformNumber.xslt" ?>
<numbers>
    <number>#########</number>
    <number>####</number>
    <number>####</number>
    <number>#</number>
    <number>###########</number>
    <number>#####</number>
</numbers>

转换算法

(1234 -> 10234)
(10234->010234)
value:01 place:3 evaluates to 'One Thousand'
value:02 place:2 evaluates to 'Two Hundred'
value:34 place:1 evaluates to 'Thirty Four'

导致结果string:'One Thousand Two Hundred Thirty Four'。

  1. 读取 XML 中的每个数字,并检查它是否包含百位数值。 如果是,则在string中从右侧位置的第四个位置插入一个“0”字符。(此步骤处理异常,因为在印度位值数字系统中,只有百位数值被评估为个位数;其余位置具有成对的值。)
  2. 检查步骤 1 之后,string是否包含奇数个字符。 如果是,则在string前加上一个“0”字符。(此步骤确保string包含偶数个字符;因此,string稍后将被拆分为数字对,并转换为其string等效项。)
  3. 对于每一对,使用该对值及其在string中的位置调用转换器。 位置由string的长度除以2确定。

翻译器算法

每一对包含两个数字。

(34 -> 3 + '0' -> 30 -> Thirty)
(34 -> 4 -> Four)
(3 -> 3-1 -> 2 -> Thousand)
  1. 分离第一个数字,并在其后附加一个“0”字符。 将其翻译成等效的string表示形式。 如果值为零,则不执行任何操作。
  2. 取第二个数字并放入其对应的字符串表示形式。 如果值为零,则不执行任何操作。
  3. 取位值并将其翻译为表示此string对在整个数字中的实际位置。 如果位置为零,则不执行任何操作。

关注点

此项目中的 XSLT 文件可以帮助你理解调用递归模板,还可以让你了解如何使用内置函数。 我们可以以此为基础,并为英语数字系统翻译设计我们自己的 XSLT。

© . All rights reserved.