0

python中有什么方法可以将十进制数(99.3)转换为(٩٩.٣)

我可以将简单的整数转换为东部阿拉伯语,但问题在于十进制。

devanagari_nums = ('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹')
number = str(numeral)
return ''.join(devanagari_nums[int(digit)] for digit in number)
4

1 回答 1

1

有三种方法(也许更多)来解决这个问题。一种是使用输入数字的数值(例如"6"转换为6)作为带有输出数字的元组的索引。正如您所发现的,这样做的困难在于小数点没有数值。您可以使用if-test 解决此问题:

>>> numeral = 12.345
>>> number = str(numeral)
>>> number
'12.345'
>>> digits = [devanagari_nums[int(k)]  if k.isdigit() else k for k in number]
>>> ''.join(digits)
'۱۲۳.۴۵'

当需要查找时,Python 程序员几乎会自动找到字典。因此,另一种明显的方法是使用字典而不是元组作为查找表。这相当于明确说明等价'6' => '۶'性,而不是依赖于'۶'占据元组的第 6 个位置。

>>> devanagari_nums = {'0':'۰', '1':'۱', '2':'۲', '3':'۳', '4':'۴', '5':'۵', '6':'۶', '7':'۷', '8':'۸', '9':'۹', '.': '.'}
>>> numeral = 12.345
>>> number = str(numeral)
>>> digits = [devanagari_nums[k] for k in number ]
>>> ''.join(digits)
'۱۲۳.۴۵'

您的问题等同于99.3٩ ٩ .٣ 但我怀疑这与 SO 编辑器对 RTL 脚本的处理比您期望的更多,因为您的代码暗示您期望٩٩.٣. 如果我错了,digits.reverse()请先做''.join(digits)

第三种方法不明显,与您原来的方法相去甚远,所以我把它留到最后:

>>> tx = str.maketrans('0123456789','۰۱۲۳۴۵۶۷۸۹')
>>> number.translate(tx)   # number as defined in the earlier examples
'۱۲۳.۴۵'

这看起来像上面的第一种方式:从输入字符到输出字符的位置映射。而在 Python 2 中,情况正是如此。但在 Python 3 的底层,它是第二种方式的变体,如果你检查一下,你会很快发现tx

>>> tx
{48: 1776, 49: 1777, 50: 1778, 51: 1779, 52: 1780, 53: 1781, 54: 1782, 55: 1783, 56: 1784, 57: 1785}

我想我不需要解释ord('1') == 49ord('۱') == 1777

于 2018-03-09T13:02:51.240 回答