1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
import uno
import unohelper
import re
from org.numbertext import XNumberText
from com.sun.star.lang import Locale
from org.Numbertext import Soros
from org.Numbertext.locales import locales
from org.Numbertext.places import places
# constant
MINUS = "[-\u2212]" # ASCII hyphen/minus or Unicode minus sign
langname = {}
# loaded patterns
patterns = {}
class NUMBERTEXT( unohelper.Base, XNumberText):
def __init__(self, ctx):
sLocaleData = "com.sun.star.i18n.LocaleData"
self.LocaleData = ctx.ServiceManager.createInstance(sLocaleData)
sProvider = "com.sun.star.configuration.ConfigurationProvider"
sAccess = "com.sun.star.configuration.ConfigurationAccess"
aConfigProvider = ctx.ServiceManager.createInstance(sProvider)
prop = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
prop.Name = "nodepath"
prop.Value = "/org.openoffice.Setup/L10N"
self.aSettings = aConfigProvider.createInstanceWithArguments(sAccess,(prop,))
self.uilocale = self.aSettings.getByName("ooLocale")
self.locale = Locale("en", "US", "")
self.func = ctx.ServiceManager.createInstance('com.sun.star.sheet.FunctionAccess')
for i in locales:
langname[i.split("_")[0]] = i
def queryLocale(self, prop, loc):
if loc != None:
a = loc.split("-")
if len(a) == 1:
return Locale(a[0], "", "")
if len(a) == 2:
return Locale(a[0], a[1], "")
else:
return Locale(a[0], a[1], a[2])
locale = prop.getPropertyValue("CharLocale")
if locale != None and locale.Language != "zxx":
return locale
return Locale("en", "US", "")
# set module name for importing locale data
def getModule(self, Language, Country, Variant):
global patterns
if Country == "":
module = Language
if Variant == "":
module = Language + "_" + Country
else:
module = Language + "_" + Country + "_" + Variant
if not module in locales:
module = Language + "_" + Country
if not module in locales:
module = Language
if not module in locales:
try:
module = langname[Language]
except:
module = "en_US"
if not module in patterns:
try:
d = __import__("numbertext_" + module)
except:
try:
d = __import__("numbertext_" + Language)
except:
return "Error: missing language data (" + module + ")"
patterns[module] = Soros.compile(d.__doc__, module.replace("_", "-"))
return module
def getCurrency(self, locale):
allcurr = self.LocaleData.getAllCurrencies(locale)
if allcurr != None:
struct = uno.createUnoStruct("com.sun.star.i18n.Currency")
for struct in allcurr:
if struct.Default:
return struct
return None
# XNumberText method implementations
def moneytext(self, prop, num, curr, loc):
global patterns
num = num.strip()
# query document language
locale = self.queryLocale(prop, loc)
mod = self.getModule(locale.Language, locale.Country, locale.Variant)
decimalplaces = 2;
if curr == None:
currency = self.getCurrency(locale)
decimalplaces = currency.DecimalPlaces
outcurr = currency.ID + " "
else:
outcurr = curr + " "
if curr in places:
decimalplaces = places[curr]
if num.rfind(".") > -1 or num.rfind(",") > -1:
num = float(num.replace(",","."))
if (type(decimalplaces) == type(0.1)):
pl = 10**decimalplaces;
num = str(round(num * pl) / pl)
else:
num = str(self.func.callFunction("round", (num, decimalplaces)))
return get_numbertext(outcurr + num, patterns[mod])
def numbertext(self, prop, num, loc):
global patterns
# query document language
loc = self.queryLocale(prop, loc)
mod = self.getModule(loc.Language, loc.Country, loc.Variant)
return get_numbertext(num.strip(), patterns[mod])
def get_numbertext(num, conv):
try:
n = conv.run(num)
n = n[0].upper() + n[1:]
except:
return "Conversion error"
if n == "":
return num
return n
|