Я столкнулся с той же проблемой пару недель назад, и решение, которое я использовал, состояло в том, чтобы проверить мой код символа по диапазонам кодов символов Unicode, которые могут определять цифру.
Вот они (диапазоны взяты из источников PERL, так как они уже сделали свою работу !!):
var isDigit = function(ch)
{
var iCode = ch.charCodeAt(0)
return ( 0x0030 <= iCode && iCode <= 0x0039 )
|| ( 0x0660 <= iCode && iCode <= 0x0669 )
|| ( 0x06F0 <= iCode && iCode <= 0x06F9 )
|| ( 0x0966 <= iCode && iCode <= 0x096F )
|| ( 0x09E6 <= iCode && iCode <= 0x09EF )
|| ( 0x0A66 <= iCode && iCode <= 0x0A6F )
|| ( 0x0AE6 <= iCode && iCode <= 0x0AEF )
|| ( 0x0B66 <= iCode && iCode <= 0x0B6F )
|| ( 0x0BE6 <= iCode && iCode <= 0x0BEF )
|| ( 0x0C66 <= iCode && iCode <= 0x0C6F )
|| ( 0x0CE6 <= iCode && iCode <= 0x0CEF )
|| ( 0x0D66 <= iCode && iCode <= 0x0D6F )
|| ( 0x0E50 <= iCode && iCode <= 0x0E59 )
|| ( 0x0ED0 <= iCode && iCode <= 0x0ED9 )
|| ( 0x0F20 <= iCode && iCode <= 0x0F29 )
|| ( 0x1040 <= iCode && iCode <= 0x1049 )
|| ( 0x17E0 <= iCode && iCode <= 0x17E9 )
|| ( 0x1810 <= iCode && iCode <= 0x1819 )
|| ( 0x1946 <= iCode && iCode <= 0x194F )
|| ( 0x19D0 <= iCode && iCode <= 0x19D9 )
|| ( 0xFF10 <= iCode && iCode <= 0xFF19 )
|| ( 0x104A0 <= iCode && iCode <= 0x104A9 )
|| ( 0x1D7CE <= iCode && iCode <= 0x1D7FF )
}
Например, на тамильском языке код символа «один» равен 0x0BE7, ср.http://www.fileformat.info/info/unicode/char/BE7/index.htm, и вы можете видеть, что он является частью диапазона 0x0BE6 => 0x0BEF, так что все в порядке.