1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: 12: 13: 14: 15: 16:
17: class Horde_Support_Numerizer_Locale_Base
18: {
19: public $DIRECT_NUMS = array(
20: 'eleven' => '11',
21: 'twelve' => '12',
22: 'thirteen' => '13',
23: 'fourteen' => '14',
24: 'fifteen' => '15',
25: 'sixteen' => '16',
26: 'seventeen' => '17',
27: 'eighteen' => '18',
28: 'nineteen' => '19',
29: 'ninteen' => '19',
30: 'zero' => '0',
31: 'one' => '1',
32: 'two' => '2',
33: 'three' => '3',
34: 'four(\W|$)' => '4$1',
35: 'five' => '5',
36: 'six(\W|$)' => '6$1',
37: 'seven(\W|$)' => '7$1',
38: 'eight(\W|$)' => '8$1',
39: 'nine(\W|$)' => '9$1',
40: 'ten' => '10',
41: '\ba[\b^$]' => '1',
42: );
43:
44: public $TEN_PREFIXES = array(
45: 'twenty' => 20,
46: 'thirty' => 30,
47: 'forty' => 40,
48: 'fourty' => 40,
49: 'fifty' => 50,
50: 'sixty' => 60,
51: 'seventy' => 70,
52: 'eighty' => 80,
53: 'ninety' => 90,
54: 'ninty' => 90,
55: );
56:
57: public $BIG_PREFIXES = array(
58: 'hundred' => 100,
59: 'thousand' => 1000,
60: 'million' => 1000000,
61: 'billion' => 1000000000,
62: 'trillion' => 1000000000000,
63: );
64:
65: public function numerize($string)
66: {
67:
68: $string = $this->_splitHyphenatedWords($string);
69: $string = $this->_hideAHalf($string);
70:
71: $string = $this->_directReplacements($string);
72: $string = $this->_replaceTenPrefixes($string);
73: $string = $this->_replaceBigPrefixes($string);
74: $string = $this->_fractionalAddition($string);
75:
76: return $string;
77: }
78:
79: 80: 81:
82: protected function _splitHyphenatedWords($string)
83: {
84: return preg_replace('/ +|([^\d])-([^d])/', '$1 $2', $string);
85: }
86:
87: 88: 89:
90: protected function _hideAHalf($string)
91: {
92: return str_replace('a half', 'haAlf', $string);
93: }
94:
95: 96: 97:
98: protected function _directReplacements($string)
99: {
100: foreach ($this->DIRECT_NUMS as $dn => $dn_replacement) {
101: $string = preg_replace("/$dn/i", $dn_replacement, $string);
102: }
103: return $string;
104: }
105:
106: 107: 108:
109: protected function _replaceTenPrefixes($string)
110: {
111: foreach ($this->TEN_PREFIXES as $tp => $tp_replacement) {
112: $string = preg_replace_callback(
113: "/(?:$tp)( *\d(?=[^\d]|\$))*/i",
114: create_function(
115: '$m',
116: 'return ' . $tp_replacement . ' + (isset($m[1]) ? (int)$m[1] : 0);'
117: ),
118: $string);
119: }
120: return $string;
121: }
122:
123: 124: 125:
126: protected function _replaceBigPrefixes($string)
127: {
128: foreach ($this->BIG_PREFIXES as $bp => $bp_replacement) {
129: $string = preg_replace_callback(
130: '/(\d*) *' . $bp . '/i',
131: create_function(
132: '$m',
133: 'return ' . $bp_replacement . ' * (int)$m[1];'
134: ),
135: $string);
136: $string = $this->_andition($string);
137: }
138: return $string;
139: }
140:
141: protected function _andition($string)
142: {
143: while (true) {
144: if (preg_match('/(\d+)( | and )(\d+)(?=[^\w]|$)/i', $string, $sc, PREG_OFFSET_CAPTURE)) {
145: if (preg_match('/and/', $sc[2][0]) || (strlen($sc[1][0]) > strlen($sc[3][0]))) {
146: $string = substr($string, 0, $sc[1][1]) . ((int)$sc[1][0] + (int)$sc[3][0]) . substr($string, $sc[3][1] + strlen($sc[3][0]));
147: continue;
148: }
149: }
150: break;
151: }
152: return $string;
153: }
154:
155: protected function _fractionalAddition($string)
156: {
157: return preg_replace_callback(
158: '/(\d+)(?: | and |-)*haAlf/i',
159: create_function(
160: '$m',
161: 'return (string)((float)$m[1] + 0.5);'
162: ),
163: $string);
164: }
165:
166: }
167: