├── _config.yml ├── NumberTranslate ├── .buildpath ├── .project └── NumberTranslate │ ├── Initialize.cls │ └── NumberTranslate.cls ├── LICENSE ├── README.md └── Version ├── CosNumberTranslation_v1.0.xml ├── CosNumberTranslation_v1.1.1.xml └── CosNumberTranslation_v1.1.xml /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /NumberTranslate/.buildpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /NumberTranslate/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | NumberTranslate 4 | 5 | 6 | 7 | 8 | 9 | com.intersystems.atelier.core.validator 10 | 11 | 12 | 13 | 14 | 15 | com.intersystems.atelier.core.nature 16 | 17 | 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 FRANCISCO LOPEZ DE LAS HERAS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NumberTranslate 2 | 3 | [![Gitter](https://img.shields.io/badge/article-on%20community-blue.svg)](https://community.intersystems.com/post/translate-number-text) 4 | 5 | Convert number to text for Cache Object Script (Intersystems) 6 | ### Overview 7 | 8 | the aim of this function is to convert numbers into text. 9 | It allows a maximum number of 15 digits. 10 | The translation is done in several languages. The allowed languages are 11 | 12 | - **es:** Spanish 13 | - **en:** English 14 | - **ca:** Catalan 15 | - **ru:** Russian 16 | 17 | The function also allows to treat the numbers of 10^9 (millards) in English-speaking countries format. See the following link [Billion Wikipedia](https://en.wikipedia.org/wiki/Billion) 18 | 19 | ### Example 20 | ```sh 21 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc) 22 | one hundred and twenty-three 23 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"es") 24 | ciento veintitres 25 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ca") 26 | cent vint-i-tres 27 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ru") 28 | Сто двадцать три 29 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",1) 30 | one billion 31 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",0) 32 | one thousand millions 33 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",1) 34 | one trillion 35 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",0) 36 | one billion 37 | ``` 38 | 39 | In case of error, you can catch the error with the status variable 40 | 41 | ```sh 42 | USER> set text=##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"fr") 43 | USER> if ('tSc) { w $System.Status.GetErrorText(tSc) } else { w text } 44 | ERROR #420: Lang fr not exists 45 | ``` 46 | 47 | ### Version history 48 | 2018-08-08 [Version 1.1.1](https://github.com/KurroLopez/CosNumberTranslate/blob/master/Version/CosNumberTranslation_v1.1.1.xml) - Fixed issue about "hundred" 49 | 50 | 2018-08-07 [Version 1.1](https://github.com/KurroLopez/CosNumberTranslate/blob/master/Version/CosNumberTranslation_v1.1.xml) - Russian translate 51 | 52 | 2018-06-29 [Version 1.0](https://github.com/KurroLopez/CosNumberTranslate/blob/master/Version/CosNumberTranslation_v1.0.xml) - Initial version 53 | -------------------------------------------------------------------------------- /NumberTranslate/NumberTranslate/Initialize.cls: -------------------------------------------------------------------------------- 1 | /// Initialize Global with number translate 2 | Class NumberTranslate.Initialize Extends %RegisteredObject 3 | { 4 | 5 | ClassMethod Initialize() 6 | { 7 | kill ^NumberTranslate 8 | 9 | // Create the global variable with texto according to lang and number 10 | set ^NumberTranslate("Config")=1 11 | set ^NumberTranslate("Config","lang")="es;ca;en" 12 | 13 | set ^NumberTranslate("Config","lang","es","billions")="billones" 14 | set ^NumberTranslate("Config","lang","es","billion")="billón" 15 | set ^NumberTranslate("Config","lang","es","million")="millón" 16 | set ^NumberTranslate("Config","lang","es","millions")="millones" 17 | set ^NumberTranslate("Config","lang","es","trillion")="trillón" 18 | set ^NumberTranslate("Config","lang","es","trillions")="trillones" 19 | set ^NumberTranslate("Config","lang","es","thousand")="mil" 20 | set ^NumberTranslate("Config","lang","es","hundred")="cien" 21 | set ^NumberTranslate("Config","lang","es","unit")="un" 22 | set ^NumberTranslate("Config","lang","es","concat-tens")=" y " 23 | set ^NumberTranslate("Config","lang","es","concat-cents")=" " 24 | 25 | set ^NumberTranslate("Config","lang","ca","billion")="bilió" 26 | set ^NumberTranslate("Config","lang","ca","billions")="bilions" 27 | set ^NumberTranslate("Config","lang","ca","million")="milió" 28 | set ^NumberTranslate("Config","lang","ca","millions")="milions" 29 | set ^NumberTranslate("Config","lang","ca","trillion")="trilló" 30 | set ^NumberTranslate("Config","lang","ca","trillions")="trillons" 31 | set ^NumberTranslate("Config","lang","ca","thousand")="mil" 32 | set ^NumberTranslate("Config","lang","ca","hundred")="cent" 33 | set ^NumberTranslate("Config","lang","ca","unit")="un" 34 | set ^NumberTranslate("Config","lang","ca","concat-tens")="-" 35 | set ^NumberTranslate("Config","lang","ca","concat-cents")=" " 36 | 37 | set ^NumberTranslate("Config","lang","en","billion")="billion" 38 | set ^NumberTranslate("Config","lang","en","billions")="billions" 39 | set ^NumberTranslate("Config","lang","en","million")="million" 40 | set ^NumberTranslate("Config","lang","en","millions")="millions" 41 | set ^NumberTranslate("Config","lang","en","trillion")="trillion" 42 | set ^NumberTranslate("Config","lang","en","trillions")="trillions" 43 | set ^NumberTranslate("Config","lang","en","thousand")="thousand" 44 | set ^NumberTranslate("Config","lang","en","hundred")="hundred" 45 | set ^NumberTranslate("Config","lang","en","unit")="one" 46 | set ^NumberTranslate("Config","lang","en","concat-tens")="-" 47 | set ^NumberTranslate("Config","lang","en","concat-cents")=" and " 48 | 49 | set ^NumberTranslate("Current","lang")="en" 50 | set ^NumberTranslate("Current","culture")="" 51 | set ^NumberTranslate("Current","debug")=0 52 | 53 | // Number definition 54 | // units and tens (es) 55 | set ^NumberTranslate("Config","lang","es","unit",1)="uno" 56 | set ^NumberTranslate("Config","lang","es","unit",2)="dos" 57 | set ^NumberTranslate("Config","lang","es","unit",3)="tres" 58 | set ^NumberTranslate("Config","lang","es","unit",4)="cuatro" 59 | set ^NumberTranslate("Config","lang","es","unit",5)="cinco" 60 | set ^NumberTranslate("Config","lang","es","unit",6)="seis" 61 | set ^NumberTranslate("Config","lang","es","unit",7)="siete" 62 | set ^NumberTranslate("Config","lang","es","unit",8)="ocho" 63 | set ^NumberTranslate("Config","lang","es","unit",9)="nueve" 64 | set ^NumberTranslate("Config","lang","es","unit",10)="diez" 65 | set ^NumberTranslate("Config","lang","es","unit",11)="once" 66 | set ^NumberTranslate("Config","lang","es","unit",12)="doce" 67 | set ^NumberTranslate("Config","lang","es","unit",13)="trece" 68 | set ^NumberTranslate("Config","lang","es","unit",14)="catorce" 69 | set ^NumberTranslate("Config","lang","es","unit",15)="quince" 70 | set ^NumberTranslate("Config","lang","es","unit",16)="dieciseis" 71 | set ^NumberTranslate("Config","lang","es","unit",17)="diecisiete" 72 | set ^NumberTranslate("Config","lang","es","unit",18)="dieciocho" 73 | set ^NumberTranslate("Config","lang","es","unit",19)="diecinueve" 74 | set ^NumberTranslate("Config","lang","es","unit",20)="veinti" 75 | set ^NumberTranslate("Config","lang","es","unit",21)="treinta" 76 | set ^NumberTranslate("Config","lang","es","unit",22)="cuarenta" 77 | set ^NumberTranslate("Config","lang","es","unit",23)="cincuenta" 78 | set ^NumberTranslate("Config","lang","es","unit",24)="sesenta" 79 | set ^NumberTranslate("Config","lang","es","unit",25)="setenta" 80 | set ^NumberTranslate("Config","lang","es","unit",26)="ochenta" 81 | set ^NumberTranslate("Config","lang","es","unit",27)="noventa" 82 | set ^NumberTranslate("Config","lang","es","unit",29)="veinte" 83 | 84 | // units and tens (ca) 85 | set ^NumberTranslate("Config","lang","ca","unit",1)="u" 86 | set ^NumberTranslate("Config","lang","ca","unit",2)="dos" 87 | set ^NumberTranslate("Config","lang","ca","unit",3)="tres" 88 | set ^NumberTranslate("Config","lang","ca","unit",4)="quatre" 89 | set ^NumberTranslate("Config","lang","ca","unit",5)="cinc" 90 | set ^NumberTranslate("Config","lang","ca","unit",6)="sis" 91 | set ^NumberTranslate("Config","lang","ca","unit",7)="set" 92 | set ^NumberTranslate("Config","lang","ca","unit",8)="vuit" 93 | set ^NumberTranslate("Config","lang","ca","unit",9)="nou" 94 | set ^NumberTranslate("Config","lang","ca","unit",10)="deu" 95 | set ^NumberTranslate("Config","lang","ca","unit",11)="onze" 96 | set ^NumberTranslate("Config","lang","ca","unit",12)="dotze" 97 | set ^NumberTranslate("Config","lang","ca","unit",13)="tretze" 98 | set ^NumberTranslate("Config","lang","ca","unit",14)="catorze" 99 | set ^NumberTranslate("Config","lang","ca","unit",15)="quinze" 100 | set ^NumberTranslate("Config","lang","ca","unit",16)="setze" 101 | set ^NumberTranslate("Config","lang","ca","unit",17)="disset" 102 | set ^NumberTranslate("Config","lang","ca","unit",18)="divuit" 103 | set ^NumberTranslate("Config","lang","ca","unit",19)="dinou" 104 | set ^NumberTranslate("Config","lang","ca","unit",20)="vint-i" 105 | set ^NumberTranslate("Config","lang","ca","unit",21)="trenta" 106 | set ^NumberTranslate("Config","lang","ca","unit",22)="quaranta" 107 | set ^NumberTranslate("Config","lang","ca","unit",23)="cinquanta" 108 | set ^NumberTranslate("Config","lang","ca","unit",24)="seixanta" 109 | set ^NumberTranslate("Config","lang","ca","unit",25)="setanta" 110 | set ^NumberTranslate("Config","lang","ca","unit",26)="vuitanta" 111 | set ^NumberTranslate("Config","lang","ca","unit",27)="noranta" 112 | set ^NumberTranslate("Config","lang","ca","unit",29)="vint" 113 | 114 | // units and tens (en) 115 | set ^NumberTranslate("Config","lang","en","unit",1)="one" 116 | set ^NumberTranslate("Config","lang","en","unit",2)="two" 117 | set ^NumberTranslate("Config","lang","en","unit",3)="three" 118 | set ^NumberTranslate("Config","lang","en","unit",4)="four" 119 | set ^NumberTranslate("Config","lang","en","unit",5)="five" 120 | set ^NumberTranslate("Config","lang","en","unit",6)="six" 121 | set ^NumberTranslate("Config","lang","en","unit",7)="seven" 122 | set ^NumberTranslate("Config","lang","en","unit",8)="eight" 123 | set ^NumberTranslate("Config","lang","en","unit",9)="nine" 124 | set ^NumberTranslate("Config","lang","en","unit",10)="ten" 125 | set ^NumberTranslate("Config","lang","en","unit",11)="eleven" 126 | set ^NumberTranslate("Config","lang","en","unit",12)="twelve" 127 | set ^NumberTranslate("Config","lang","en","unit",13)="thirteen" 128 | set ^NumberTranslate("Config","lang","en","unit",14)="fourteen" 129 | set ^NumberTranslate("Config","lang","en","unit",15)="fiveteen" 130 | set ^NumberTranslate("Config","lang","en","unit",16)="sixteen" 131 | set ^NumberTranslate("Config","lang","en","unit",17)="seventeen" 132 | set ^NumberTranslate("Config","lang","en","unit",18)="eighteen" 133 | set ^NumberTranslate("Config","lang","en","unit",19)="nineteen" 134 | set ^NumberTranslate("Config","lang","en","unit",20)="twenty" 135 | set ^NumberTranslate("Config","lang","en","unit",21)="thirty" 136 | set ^NumberTranslate("Config","lang","en","unit",22)="forty" 137 | set ^NumberTranslate("Config","lang","en","unit",23)="fifty" 138 | set ^NumberTranslate("Config","lang","en","unit",24)="sixty" 139 | set ^NumberTranslate("Config","lang","en","unit",25)="seventy" 140 | set ^NumberTranslate("Config","lang","en","unit",26)="eighty" 141 | set ^NumberTranslate("Config","lang","en","unit",27)="ninety" 142 | set ^NumberTranslate("Config","lang","en","unit",29)="twenty" 143 | 144 | // Hundreds (es) 145 | set ^NumberTranslate("Config","lang","es","hundred",1)="ciento" 146 | set ^NumberTranslate("Config","lang","es","hundred",2)="doscientos" 147 | set ^NumberTranslate("Config","lang","es","hundred",3)="trescientos" 148 | set ^NumberTranslate("Config","lang","es","hundred",4)="cuatrocientos" 149 | set ^NumberTranslate("Config","lang","es","hundred",5)="quinientos" 150 | set ^NumberTranslate("Config","lang","es","hundred",6)="seicientos" 151 | set ^NumberTranslate("Config","lang","es","hundred",7)="setecientos" 152 | set ^NumberTranslate("Config","lang","es","hundred",8)="ochocientos" 153 | set ^NumberTranslate("Config","lang","es","hundred",9)="novecientos" 154 | 155 | // Hundreds (ca) 156 | set ^NumberTranslate("Config","lang","ca","hundred",1)="cent" 157 | set ^NumberTranslate("Config","lang","ca","hundred",2)="dos-cents" 158 | set ^NumberTranslate("Config","lang","ca","hundred",3)="tres-cents" 159 | set ^NumberTranslate("Config","lang","ca","hundred",4)="quatre-cents" 160 | set ^NumberTranslate("Config","lang","ca","hundred",5)="cinc-cents" 161 | set ^NumberTranslate("Config","lang","ca","hundred",6)="sis-cents" 162 | set ^NumberTranslate("Config","lang","ca","hundred",7)="set-cents" 163 | set ^NumberTranslate("Config","lang","ca","hundred",8)="vuit-cents" 164 | set ^NumberTranslate("Config","lang","ca","hundred",9)="nou-cents" 165 | 166 | // Hundreds (en) 167 | set ^NumberTranslate("Config","lang","en","hundred",1)="one hundred" 168 | set ^NumberTranslate("Config","lang","en","hundred",2)="two hundred" 169 | set ^NumberTranslate("Config","lang","en","hundred",3)="three hundred" 170 | set ^NumberTranslate("Config","lang","en","hundred",4)="four hundred" 171 | set ^NumberTranslate("Config","lang","en","hundred",5)="five hundred" 172 | set ^NumberTranslate("Config","lang","en","hundred",6)="six hundred" 173 | set ^NumberTranslate("Config","lang","en","hundred",7)="seven hundred" 174 | set ^NumberTranslate("Config","lang","en","hundred",8)="eight hundred" 175 | set ^NumberTranslate("Config","lang","en","hundred",9)="nine hundred" 176 | } 177 | 178 | } 179 | -------------------------------------------------------------------------------- /NumberTranslate/NumberTranslate/NumberTranslate.cls: -------------------------------------------------------------------------------- 1 | /// 2 | /// NumberTranslate.NumberTranslate 3 | ///

NumberTranslate

4 | ///

Overview

5 | ///

the aim of this function is to convert numbers into text.

6 | ///

It allows a maximum number of 15 digits.

7 | ///

The translation is done in several languages. The allowed languages are

8 | ///

13 | ///

The function also allows to treat the numbers of 10^9 (millards) in English-speaking countries format. See the following link Billion Wikipedia

14 | ///

Example

15 | ///
 16 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc)
 17 | /// one hundred and twenty-three
 18 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"es")
 19 | /// ciento veintitres
 20 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ca")
 21 | /// cent vint-i-tres
 22 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",1)
 23 | /// one billion
 24 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",0)
 25 | /// one thousand millions
 26 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",1)
 27 | /// one trillion
 28 | /// USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",0)
 29 | /// one billion
 30 | /// 
31 | ///

In case of error, you can catch the error with the status variable 32 | ///

 33 | /// USER> set text=##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"fr") 
 34 | /// USER> if ('tSc) { w $System.Status.GetErrorText(tSc) } else { w text }        
 35 | /// ERROR #420: Lang fr not exists
 36 | /// 
37 | /// 38 | Class NumberTranslate.NumberTranslate Extends %RegisteredObject [ Not ProcedureBlock ] 39 | { 40 | 41 | /// Internal method to get trio of digit and translate according to language 42 | Method Trio(pTrio As %String) As %String 43 | { 44 | set obj=..%New() 45 | if (^NumberTranslate("Current","debug")) 46 | { 47 | w "--------------",! 48 | w "Value trio:",?25,pTrio,! 49 | } 50 | set lcent = $EXTRACT(pTrio,1,1) 51 | set lten = $EXTRACT(pTrio,2,2) 52 | set lunit = $EXTRACT(pTrio,3,3) 53 | 54 | set lang = ^NumberTranslate("Current","lang") 55 | 56 | set figure = "" 57 | 58 | // First figure (cent) 59 | if (lcent>0) 60 | { 61 | set figure=figure_$SELECT((lcent=1)&&((lten=0)&&(lunit=0)):^NumberTranslate("Config","lang",lang,"hundred"), 62 | 1:^NumberTranslate("Config","lang",lang,"hundred",lcent)) 63 | } 64 | 65 | if (lcent>0)&&((lten>0)||(lunit>0)) 66 | { 67 | set figure=figure_^NumberTranslate("Config","lang",lang,"concat-cents") 68 | } 69 | 70 | // Second figure (tens) 71 | if ((lten>=3)&&(lten<=9)) 72 | { 73 | set figure = figure_$SELECT(lunit=0:obj.GetDigit(lten*10)_" ",lunit>0:obj.GetDigit(lten*10)_^NumberTranslate("Config","lang",lang,"concat-tens")) 74 | } elseif (lten = 2) 75 | { 76 | set figure = figure_$SELECT(lunit=0:^NumberTranslate("Config","lang",lang,"unit",29)_" ",1:obj.GetDigit(lten*10)) 77 | // Condition only for Spanish and twenty 78 | if (lang'="es")&&(lunit>0) 79 | { 80 | set figure = figure_^NumberTranslate("Config","lang",lang,"concat-tens") 81 | } 82 | } elseif (lten = 1) 83 | { 84 | set figure = figure_" "_obj.GetDigit((lten*10)+lunit)_" " 85 | } 86 | 87 | // Third figure (unit) 88 | if ((lunit>0)&&(lten'=1)) 89 | { 90 | set figure = figure_obj.GetDigit(lunit) 91 | } 92 | 93 | 94 | // Remove all double spaces 95 | set figure=$Replace(figure," "," ") 96 | k obj 97 | quit figure 98 | } 99 | 100 | /// Internal method to get the text of digit 101 | Method GetDigit(pNumber As %Integer) As %String 102 | { 103 | set sCurrent = "" 104 | set lang = ^NumberTranslate("Current","lang") 105 | 106 | if (pNumber <= 20) 107 | { 108 | // From 1 to 20 is the same than position of Unit 109 | set sCurrent = ^NumberTranslate("Config","lang",lang,"unit",pNumber) 110 | } 111 | else 112 | { 113 | set lNumber = pNumber - 30 114 | set lPos = 0 115 | if (lNumber < 0) 116 | { 117 | set lNumber = lNumber * -1 118 | set lPos = (lNumber/10) + 21 119 | } 120 | else 121 | { 122 | if (lNumber = 0) 123 | { 124 | set lPos = 21 125 | } 126 | else 127 | { 128 | set lPos = (lNumber/10) + 21 129 | } 130 | } 131 | set sCurrent = ^NumberTranslate("Config","lang",lang,"unit",lPos) 132 | } 133 | 134 | quit sCurrent 135 | } 136 | 137 | /// Translate a number to text 138 | ClassMethod GetText(pNumber As %Decimal, Output pStatus As %Status, pLang As %String = "en", pEngBillion As %Boolean = 0) As %String 139 | { 140 | quit:pLang="ru" $piece(..WriteSumma(pNumber), " руб") 141 | set obj=..%New() 142 | set pStatus = $$$OK 143 | set tResult = "" 144 | // Check if code is installed 145 | if ($Get(^NumberTranslate("Config"))'=1) 146 | { 147 | do ##class(NumberTranslate.Initialize).Initialize() 148 | } 149 | 150 | //Allowed langs ^NumberTranslate("Config","lang") 151 | if ('$listfind($LISTFROMSTRING(^NumberTranslate("Config","lang"),";"),pLang)) 152 | { 153 | SET pStatus = $System.Status.Error(420,"Lang",pLang) 154 | Quit tResult 155 | } 156 | 157 | set ^NumberTranslate("Current","lang")=pLang 158 | set ^NumberTranslate("Current","culture")=$CASE(pEngBillion,1:"en",0:"") 159 | 160 | set number = $System.SQL.TOCHAR(pNumber,"000000000000000") 161 | set billion=$Extract(number,0,4) 162 | set millard=$Extract(number,5,7) 163 | set million=$Extract(number,8,10) 164 | set thousand=$Extract(number,11,13) 165 | set cents=$Extract(number,14,16) 166 | 167 | if (^NumberTranslate("Current","debug")) 168 | { 169 | w "Number to process:",?25,number,! 170 | w "(EUR) Billion:",?25,billion,! 171 | w "Millard:",?25,millard,! 172 | w "Million:",?25,million,! 173 | w "Thousand:",?25,thousand,! 174 | w "Cents:",?25,cents,! 175 | } 176 | 177 | // Five blocks, watch out with billion USA and billion EUR 178 | for block=1:1:5 179 | { 180 | if (block=1) // (EUR) Billion / (ENG) Trillion 181 | { 182 | // Acording to culture, the text could be trillion or billion 183 | set textBlock=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"trillion"),0:^NumberTranslate("Config","lang",pLang,"billion")) 184 | set textBlocks=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"trillions"),0:^NumberTranslate("Config","lang",pLang,"billions")) 185 | 186 | set tResult=tResult_" "_$SELECT($Number(billion)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock,$Number(billion)>1:obj.Trio(billion)_" "_textBlocks,1:"") 187 | } 188 | if (block=2) // (EUR) Thousand million / (ENG) Billion 189 | { 190 | // Acording to culture, the text could be billion or thousand (of billion) 191 | set textBlock=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billion"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 192 | set textBlocks=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billions"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 193 | 194 | set tResult=tResult_" "_$SELECT($Number(millard)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, $Number(millard)>1:obj.Trio(millard)_" "_textBlocks, 1:"") 195 | 196 | } 197 | if (block=3) // Million 198 | { 199 | set textBlock=^NumberTranslate("Config","lang",pLang,"million") 200 | set textBlocks=^NumberTranslate("Config","lang",pLang,"millions") 201 | 202 | set tResult=tResult_" "_$SELECT($Number(million)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, 203 | $Number(million)>1:obj.Trio(million)_" "_textBlocks, 204 | $Number(millard)>0: $SELECT(pEngBillion=1:" ",1:" "_textBlocks),1:"") 205 | } 206 | if (block=4) // Thousand 207 | { 208 | set textBlock=^NumberTranslate("Config","lang",pLang,"thousand") 209 | 210 | set tResult=tResult_" "_$SELECT($Number(thousand)=1:textBlock, $Number(thousand)>1:obj.Trio(thousand)_" "_textBlock,1:"") 211 | } 212 | if (block=5) // Cents 213 | { 214 | set tResult=tResult_" "_obj.Trio(cents) 215 | } 216 | } 217 | 218 | k obj 219 | set tResult = $ZSTRIP($Replace(tResult," "," "),"<>"," ") 220 | Quit tResult 221 | } 222 | 223 | /// Russian Translate 224 | ClassMethod WriteSumma(summa As %Decimal = "") As %String 225 | { 226 | new SUMMA,SUMMAP,%X,%X0,%X1,R0,R1,VV,V2,V3,V 227 | set SUMMA=summa 228 | I +SUMMA'<1000000000000 S SUMMAP=SUMMA G END0 ;### 229 | I +SUMMA<0 S SUMMA=-SUMMA 230 | S %X=+$P(SUMMA,".",1),SUMMAP="",VV=0 231 | ;I %X=0 S SUMMAP="ноль рублей" 232 | I %X=0 S SUMMAP="ноль " 233 | I %X>0 D PRUBL 234 | S V2=$E(%X,$L(%X)-1),V3=$E(%X,$L(%X)) 235 | I V3=1,V2'=1 S SUMMAP=SUMMAP_" рубль",VV=1 236 | I ((V3=2)!(V3=3)!(V3=4))&(V2'=1) S SUMMAP=SUMMAP_" рубля",VV=1 237 | I ((V3=1)!(V3=2)!(V3=3)!(V3=4))&(V2=1) S SUMMAP=SUMMAP_" рублей",VV=1 238 | I V3>4 S SUMMAP=SUMMAP_" рублей",VV=1 239 | I VV=0 S SUMMAP=SUMMAP_" рублей" 240 | S %X=$P(SUMMA,".",2) I %X="" S %X="00" 241 | I %X?1N S %X=%X_"0",(V1,V)="0" 242 | I %X?2N S V1=$E(%X,1,1),V=$E(%X,2,2) 243 | R1 I (V="1")&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейка" 244 | I ((V="2")!(V="3")!(V="4"))&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейки" 245 | I ((V'="1")&(V'="2")&(V'="3")&(V'="4"))!(V1="1") S SUMMAP=SUMMAP_" "_%X_" копеек" 246 | I $E(SUMMAP)=" " S SUMMAP=$E(SUMMAP,2,255) 247 | S SUMMAP=$TR($E(SUMMAP),"одтчпшсвн","ОДТЧПШСВН")_$E(SUMMAP,2,255) 248 | END0 K %X,%X0,%X1,R0,R1 249 | Q (SUMMAP) ;1 250 | ;- 251 | PRUBL ; Euro 252 | D PMILR,PMILE,PtYS,PEDIN 253 | Q ;Added 254 | ;- 255 | PMILR ;BILLION 256 | S %X0=%X\1000000000 Q:%X0=0 ;### 257 | D PSoT,PDES 258 | 259 | RRR3 S SUMMAP=SUMMAP_" миллиард"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 260 | K R3 261 | Q ;PMILR 262 | ;- 263 | PMILE ;Millions 264 | ;S %X0=%X\1000000 Q:%X0=0 ;### 265 | S %X0=%X#1000000000\1000000 Q:%X0=0 ;### 266 | D PSoT,PDES 267 | 268 | R3 S SUMMAP=SUMMAP_" миллион"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 269 | K R3 270 | Q ;PMILE 271 | ;- 272 | PtYS ;THOUSAND 273 | S %X0=%X#1000000\1000 Q:%X0=0 ;### 274 | D PSoT,PDES 275 | S %X1=$E(SUMMAP,$L(SUMMAP)-2,$L(SUMMAP)) 276 | I %X1="ва " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"ве " 277 | I %X1="ин " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"на " 278 | QQ S SUMMAP=SUMMAP_"тысяч"_$S(%X0#100=11:"",%X0#100=12:"",%X0#100=13:"",%X0#100=14:"",%X0#10=1:"а",%X0#10>1&(%X0#10<5):"и",1:"")_" " 279 | K R4,R5,R6 280 | Q ;PtYS 281 | ;- 282 | PEDIN ;UNITS IN BREAKDOWN 283 | S %X0=%X#1000 Q:%X0=0 ;### 284 | D PSoT,PDES 285 | Q ;PtDIN 286 | ;- 287 | PSoT ;HUNDREDS 288 | S %X1=%X0\100 Q:%X1=0 ;### 289 | R7 S S1="сто" 290 | R8 S S2="двести" 291 | R9 S S3="триста" 292 | R10 S S4="четыреста" 293 | R11 S S5="пятьсот" 294 | R12 S S6="шестьсот" 295 | R13 S S7="семьсот" 296 | R14 S S8="восемьсот" 297 | R15 S S9="девятьсот" 298 | S SUMMAP=SUMMAP_$S(%X1=1:S1,%X1=2:S2,%X1=3:S3,%X1=4:S4,%X1=5:S5,%X1=6:S6,%X1=7:S7,%X1=8:S8,%X1=9:S9)_" " 299 | K S1,S2,S3,S4,S5,S6,S7,S8,S9 300 | Q ;PSoT 301 | ;- 302 | PDES ;TENS 303 | S %X1=%X0#100\10 Q:%X=0 ;### 304 | I %X1=1 D PDC Q ;### 305 | R17 S D2="двадцать" 306 | R18 S D3="тридцать" 307 | R19 S D4="сорок" 308 | R20 S D5="пятьдесят" 309 | R21 S D6="шестьдесят" 310 | R22 S D7="семьдесят" 311 | R23 S D8="восемьдесят" 312 | R24 S D9="девяносто" 313 | S SUMMAP=SUMMAP_$S(%X1=2:D2,%X1=3:D3,%X1=4:D4,%X1=5:D5,%X1=6:D6,%X1=7:D7,%X1=8:D8,%X1=9:D9,1:"")_" " 314 | K D2,D3,D4,D5,D6,D7,D8,D9 315 | D PoDIN 316 | Q ;PDES 317 | ;- 318 | PDC ; 319 | S %X1=%X0#10 320 | R25 S F0="десять" 321 | R26 S F1="одиннадцать" 322 | R27 S F2="двенадцать" 323 | R28 S F3="тринадцать" 324 | R29 S F4="четырнадцать" 325 | R30 S F5="пятнадцать" 326 | R31 S F6="шестнадцать" 327 | R32 S F7="семнадцать" 328 | R33 S F8="восемнадцать" 329 | R34 S F9="девятнадцать" 330 | S SUMMAP=SUMMAP_$S(%X1=0:F0,%X1=1:F1,%X1=2:F2,%X1=3:F3,%X1=4:F4,%X1=5:F5,%X1=6:F6,%X1=7:F7,%X1=8:F8,%X1=9:F9) 331 | K F0,F1,F2,F3,F4,F5,F6,F7,F8,F9 332 | Q ;PDC 333 | ;- 334 | PoDIN ;UNITS 335 | S %X1=%X0#10 I %X1=0 Q ;### 336 | S SUMMAP=SUMMAP_$S(%X1=1:"один",%X1=2:"два",%X1=3:"три",%X1=4:"четыре",%X1=5:"пять",%X1=6:"шесть",%X1=7:"семь",%X1=8:"восемь",%X1=9:"девять",1:"")_" " 337 | K E1,E2,E3,E4,E5,E6,E7,E8,E9 338 | Q ;PoDIN 339 | } 340 | } -------------------------------------------------------------------------------- /Version/CosNumberTranslation_v1.0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Initialize Global with number translate 6 | %RegisteredObject 7 | 64823,46825.955514 8 | 64812,56223.641124 9 | 10 | 11 | 1 12 | 183 | 184 | 185 | 186 | 187 | 188 | 190 | NumberTranslate.NumberTranslate 191 |

NumberTranslate

192 |

Overview

193 |

the aim of this function is to convert numbers into text.

194 |

It allows a maximum number of 15 digits.

195 |

The translation is done in several languages. The allowed languages are

196 |

    197 |
  • es: Spanish
  • 198 |
  • en: English
  • 199 |
  • ca: Catalan
  • 200 |

201 |

The function also allows to treat the numbers of 10^9 (millards) in English-speaking countries format. See the following link Billion Wikipedia

202 |

Example

203 |
204 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc)
205 | one hundred and twenty-three
206 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"es")
207 | ciento veintitres
208 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ca")
209 | cent vint-i-tres
210 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",1)
211 | one billion
212 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",0)
213 | one thousand millions
214 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",1)
215 | one trillion
216 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",0)
217 | one billion
218 | 
219 |

In case of error, you can catch the error with the status variable 220 |

221 | USER> set text=##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"fr") 
222 | USER> if ('tSc) { w $System.Status.GetErrorText(tSc) } else { w text }        
223 | ERROR #420: Lang fr not exists
224 | 
225 | ]]>
226 | %RegisteredObject 227 | 64823,77645.812995 228 | 64812,55450.740429 229 | 230 | 231 | 232 | Internal method to get trio of digit and translate according to language 233 | pTrio:%String 234 | %String 235 | 0) 252 | { 253 | set figure=figure_$SELECT(((lten=0)&&(lunit=0)):^NumberTranslate("Config","lang",lang,"hundred"), 254 | 1:^NumberTranslate("Config","lang",lang,"hundred",lcent)) 255 | } 256 | 257 | if (lcent>0)&&((lten>0)||(lunit>0)) 258 | { 259 | set figure=figure_^NumberTranslate("Config","lang",lang,"concat-cents") 260 | } 261 | 262 | // Second figure (tens) 263 | if ((lten>=3)&&(lten<=9)) 264 | { 265 | set figure = figure_$SELECT(lunit=0:obj.GetDigit(lten*10)_" ",lunit>0:obj.GetDigit(lten*10)_^NumberTranslate("Config","lang",lang,"concat-tens")) 266 | } elseif (lten = 2) 267 | { 268 | set figure = figure_$SELECT(lunit=0:^NumberTranslate("Config","lang",lang,"unit",29)_" ",1:obj.GetDigit(lten*10)) 269 | // Condition only for Spanish and twenty 270 | if (lang'="es")&&(lunit>0) 271 | { 272 | set figure = figure_^NumberTranslate("Config","lang",lang,"concat-tens") 273 | } 274 | } elseif (lten = 1) 275 | { 276 | set figure = figure_" "_obj.GetDigit((lten*10)+lunit)_" " 277 | } 278 | 279 | // Third figure (unit) 280 | if ((lunit>0)&&(lten'=1)) 281 | { 282 | set figure = figure_obj.GetDigit(lunit) 283 | } 284 | 285 | 286 | // Remove all double spaces 287 | set figure=$Replace(figure," "," ") 288 | k obj 289 | quit figure 290 | ]]> 291 | 292 | 293 | 294 | 295 | Internal method to get the text of digit 296 | pNumber:%Integer 297 | %String 298 | 332 | 333 | 334 | 335 | 336 | Translate a number to text 337 | 1 338 | pNumber:%Decimal,*pStatus:%Status,pLang:%String="en",pEngBillion:%Boolean=0 339 | %String 340 | 1:obj.Trio(billion)_" "_textBlocks,1:"") 387 | } 388 | if (block=2) // (EUR) Thousand million / (ENG) Billion 389 | { 390 | // Acording to culture, the text could be billion or thousand (of billion) 391 | set textBlock=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billion"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 392 | set textBlocks=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billions"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 393 | 394 | set tResult=tResult_" "_$SELECT($Number(millard)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, $Number(millard)>1:obj.Trio(millard)_" "_textBlocks, 1:"") 395 | 396 | } 397 | if (block=3) // Million 398 | { 399 | set textBlock=^NumberTranslate("Config","lang",pLang,"million") 400 | set textBlocks=^NumberTranslate("Config","lang",pLang,"millions") 401 | 402 | set tResult=tResult_" "_$SELECT($Number(million)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, 403 | $Number(million)>1:obj.Trio(million)_" "_textBlocks, 404 | $Number(millard)>0: $SELECT(pEngBillion=1:" ",1:" "_textBlocks),1:"") 405 | } 406 | if (block=4) // Thousand 407 | { 408 | set textBlock=^NumberTranslate("Config","lang",pLang,"thousand") 409 | 410 | set tResult=tResult_" "_$SELECT($Number(thousand)=1:textBlock, $Number(thousand)>1:obj.Trio(thousand)_" "_textBlock,1:"") 411 | } 412 | if (block=5) // Cents 413 | { 414 | set tResult=tResult_" "_obj.Trio(cents) 415 | } 416 | } 417 | 418 | k obj 419 | set tResult = $ZSTRIP($Replace(tResult," "," "),"<>"," ") 420 | Quit tResult 421 | ]]> 422 | 423 |
424 |
425 | -------------------------------------------------------------------------------- /Version/CosNumberTranslation_v1.1.1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Initialize Global with number translate 6 | %RegisteredObject 7 | 64823,46825.955514 8 | 64812,56223.641124 9 | 10 | 11 | 1 12 | 183 | 184 | 185 | 186 | 187 | 188 | 190 | NumberTranslate.NumberTranslate 191 |

NumberTranslate

192 |

Overview

193 |

the aim of this function is to convert numbers into text.

194 |

It allows a maximum number of 15 digits.

195 |

The translation is done in several languages. The allowed languages are

196 |

    197 |
  • es: Spanish
  • 198 |
  • en: English
  • 199 |
  • ca: Catalan
  • 200 |
  • ru: Russian
  • 201 |

202 |

The function also allows to treat the numbers of 10^9 (millards) in English-speaking countries format. See the following link Billion Wikipedia

203 |

Example

204 |
205 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc)
206 | one hundred and twenty-three
207 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"es")
208 | ciento veintitres
209 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ca")
210 | cent vint-i-tres
211 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",1)
212 | one billion
213 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",0)
214 | one thousand millions
215 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",1)
216 | one trillion
217 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",0)
218 | one billion
219 | 
220 |

In case of error, you can catch the error with the status variable 221 |

222 | USER> set text=##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"fr") 
223 | USER> if ('tSc) { w $System.Status.GetErrorText(tSc) } else { w text }        
224 | ERROR #420: Lang fr not exists
225 | 
226 | ]]>
227 | 0 228 | %RegisteredObject 229 | 64855,64797.226424 230 | 64812,55450.740429 231 | 232 | 233 | 234 | Internal method to get trio of digit and translate according to language 235 | pTrio:%String 236 | %String 237 | 0) 254 | { 255 | set figure=figure_$SELECT((lcent=1)&&((lten=0)&&(lunit=0)):^NumberTranslate("Config","lang",lang,"hundred"), 256 | 1:^NumberTranslate("Config","lang",lang,"hundred",lcent)) 257 | } 258 | 259 | if (lcent>0)&&((lten>0)||(lunit>0)) 260 | { 261 | set figure=figure_^NumberTranslate("Config","lang",lang,"concat-cents") 262 | } 263 | 264 | // Second figure (tens) 265 | if ((lten>=3)&&(lten<=9)) 266 | { 267 | set figure = figure_$SELECT(lunit=0:obj.GetDigit(lten*10)_" ",lunit>0:obj.GetDigit(lten*10)_^NumberTranslate("Config","lang",lang,"concat-tens")) 268 | } elseif (lten = 2) 269 | { 270 | set figure = figure_$SELECT(lunit=0:^NumberTranslate("Config","lang",lang,"unit",29)_" ",1:obj.GetDigit(lten*10)) 271 | // Condition only for Spanish and twenty 272 | if (lang'="es")&&(lunit>0) 273 | { 274 | set figure = figure_^NumberTranslate("Config","lang",lang,"concat-tens") 275 | } 276 | } elseif (lten = 1) 277 | { 278 | set figure = figure_" "_obj.GetDigit((lten*10)+lunit)_" " 279 | } 280 | 281 | // Third figure (unit) 282 | if ((lunit>0)&&(lten'=1)) 283 | { 284 | set figure = figure_obj.GetDigit(lunit) 285 | } 286 | 287 | 288 | // Remove all double spaces 289 | set figure=$Replace(figure," "," ") 290 | k obj 291 | quit figure 292 | ]]> 293 | 294 | 295 | 296 | 297 | Internal method to get the text of digit 298 | pNumber:%Integer 299 | %String 300 | 334 | 335 | 336 | 337 | 338 | Translate a number to text 339 | 1 340 | pNumber:%Decimal,*pStatus:%Status,pLang:%String="en",pEngBillion:%Boolean=0 341 | %String 342 | 1:obj.Trio(billion)_" "_textBlocks,1:"") 390 | } 391 | if (block=2) // (EUR) Thousand million / (ENG) Billion 392 | { 393 | // Acording to culture, the text could be billion or thousand (of billion) 394 | set textBlock=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billion"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 395 | set textBlocks=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billions"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 396 | 397 | set tResult=tResult_" "_$SELECT($Number(millard)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, $Number(millard)>1:obj.Trio(millard)_" "_textBlocks, 1:"") 398 | 399 | } 400 | if (block=3) // Million 401 | { 402 | set textBlock=^NumberTranslate("Config","lang",pLang,"million") 403 | set textBlocks=^NumberTranslate("Config","lang",pLang,"millions") 404 | 405 | set tResult=tResult_" "_$SELECT($Number(million)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, 406 | $Number(million)>1:obj.Trio(million)_" "_textBlocks, 407 | $Number(millard)>0: $SELECT(pEngBillion=1:" ",1:" "_textBlocks),1:"") 408 | } 409 | if (block=4) // Thousand 410 | { 411 | set textBlock=^NumberTranslate("Config","lang",pLang,"thousand") 412 | 413 | set tResult=tResult_" "_$SELECT($Number(thousand)=1:textBlock, $Number(thousand)>1:obj.Trio(thousand)_" "_textBlock,1:"") 414 | } 415 | if (block=5) // Cents 416 | { 417 | set tResult=tResult_" "_obj.Trio(cents) 418 | } 419 | } 420 | 421 | k obj 422 | set tResult = $ZSTRIP($Replace(tResult," "," "),"<>"," ") 423 | Quit tResult 424 | ]]> 425 | 426 | 427 | 428 | 429 | перевод суммы в пропись 430 | 1 431 | summa:%Library.String="" 432 | %String 433 | 0 D PRUBL 444 | S V2=$E(%X,$L(%X)-1),V3=$E(%X,$L(%X)) 445 | I V3=1,V2'=1 S SUMMAP=SUMMAP_" рубль",VV=1 446 | I ((V3=2)!(V3=3)!(V3=4))&(V2'=1) S SUMMAP=SUMMAP_" рубля",VV=1 447 | I ((V3=1)!(V3=2)!(V3=3)!(V3=4))&(V2=1) S SUMMAP=SUMMAP_" рублей",VV=1 448 | I V3>4 S SUMMAP=SUMMAP_" рублей",VV=1 449 | I VV=0 S SUMMAP=SUMMAP_" рублей" 450 | S %X=$P(SUMMA,".",2) I %X="" S %X="00" 451 | I %X?1N S %X=%X_"0",(V1,V)="0" 452 | I %X?2N S V1=$E(%X,1,1),V=$E(%X,2,2) 453 | R1 I (V="1")&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейка" 454 | I ((V="2")!(V="3")!(V="4"))&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейки" 455 | I ((V'="1")&(V'="2")&(V'="3")&(V'="4"))!(V1="1") S SUMMAP=SUMMAP_" "_%X_" копеек" 456 | I $E(SUMMAP)=" " S SUMMAP=$E(SUMMAP,2,255) 457 | S SUMMAP=$TR($E(SUMMAP),"одтчпшсвн","ОДТЧПШСВН")_$E(SUMMAP,2,255) 458 | END0 K %X,%X0,%X1,R0,R1 459 | Q (SUMMAP) ;1 460 | ;- 461 | PRUBL ; РУБЛИ 462 | D PMILR,PMILE,PtYS,PEDIN 463 | Q ;PRUBL 464 | ;- 465 | PMILR ;МИЛЛИАРД 466 | S %X0=%X\1000000000 Q:%X0=0 ;### 467 | D PSoT,PDES 468 | ;S SUMMAP=SUMMAP_"миллион"_$S(%X0#10=1:"",%X0#10>1&(%X0#10<5):"а",1:"ов")_" " 469 | RRR3 S SUMMAP=SUMMAP_" миллиард"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 470 | K R3 471 | Q ;PMILR 472 | ;- 473 | PMILE ;МИЛЛИОНЫ 474 | ;S %X0=%X\1000000 Q:%X0=0 ;### 475 | S %X0=%X#1000000000\1000000 Q:%X0=0 ;### 476 | D PSoT,PDES 477 | ;S SUMMAP=SUMMAP_"миллион"_$S(%X0#10=1:"",%X0#10>1&(%X0#10<5):"а",1:"ов")_" " 478 | R3 S SUMMAP=SUMMAP_" миллион"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 479 | K R3 480 | Q ;PMILE 481 | ;- 482 | PtYS ;ТЫСЯЧИ 483 | S %X0=%X#1000000\1000 Q:%X0=0 ;### 484 | D PSoT,PDES 485 | S %X1=$E(SUMMAP,$L(SUMMAP)-2,$L(SUMMAP)) 486 | I %X1="ва " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"ве " 487 | I %X1="ин " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"на " 488 | QQ S SUMMAP=SUMMAP_"тысяч"_$S(%X0#100=11:"",%X0#100=12:"",%X0#100=13:"",%X0#100=14:"",%X0#10=1:"а",%X0#10>1&(%X0#10<5):"и",1:"")_" " 489 | K R4,R5,R6 490 | Q ;PtYS 491 | ;- 492 | PEDIN ;ЕДИНИЦЫ В ОСТАТКЕ 493 | S %X0=%X#1000 Q:%X0=0 ;### 494 | D PSoT,PDES 495 | Q ;PtDIN 496 | ;- 497 | PSoT ;СОТНИ 498 | S %X1=%X0\100 Q:%X1=0 ;### 499 | R7 S S1="сто" 500 | R8 S S2="двести" 501 | R9 S S3="триста" 502 | R10 S S4="четыреста" 503 | R11 S S5="пятьсот" 504 | R12 S S6="шестьсот" 505 | R13 S S7="семьсот" 506 | R14 S S8="восемьсот" 507 | R15 S S9="девятьсот" 508 | S SUMMAP=SUMMAP_$S(%X1=1:S1,%X1=2:S2,%X1=3:S3,%X1=4:S4,%X1=5:S5,%X1=6:S6,%X1=7:S7,%X1=8:S8,%X1=9:S9)_" " 509 | K S1,S2,S3,S4,S5,S6,S7,S8,S9 510 | Q ;PSoT 511 | ;- 512 | PDES ;ДЕСЯТКИ 513 | S %X1=%X0#100\10 Q:%X=0 ;### 514 | I %X1=1 D PDC Q ;### 515 | R17 S D2="двадцать" 516 | R18 S D3="тридцать" 517 | R19 S D4="сорок" 518 | R20 S D5="пятьдесят" 519 | R21 S D6="шестьдесят" 520 | R22 S D7="семьдесят" 521 | R23 S D8="восемьдесят" 522 | R24 S D9="девяносто" 523 | S SUMMAP=SUMMAP_$S(%X1=2:D2,%X1=3:D3,%X1=4:D4,%X1=5:D5,%X1=6:D6,%X1=7:D7,%X1=8:D8,%X1=9:D9,1:"")_" " 524 | K D2,D3,D4,D5,D6,D7,D8,D9 525 | D PoDIN 526 | Q ;PDES 527 | ;- 528 | PDC ; 529 | S %X1=%X0#10 530 | R25 S F0="десять" 531 | R26 S F1="одиннадцать" 532 | R27 S F2="двенадцать" 533 | R28 S F3="тринадцать" 534 | R29 S F4="четырнадцать" 535 | R30 S F5="пятнадцать" 536 | R31 S F6="шестнадцать" 537 | R32 S F7="семнадцать" 538 | R33 S F8="восемнадцать" 539 | R34 S F9="девятнадцать" 540 | S SUMMAP=SUMMAP_$S(%X1=0:F0,%X1=1:F1,%X1=2:F2,%X1=3:F3,%X1=4:F4,%X1=5:F5,%X1=6:F6,%X1=7:F7,%X1=8:F8,%X1=9:F9) 541 | K F0,F1,F2,F3,F4,F5,F6,F7,F8,F9 542 | Q ;PDC 543 | ;- 544 | PoDIN ;ЕДИНИЦЫ 545 | S %X1=%X0#10 I %X1=0 Q ;### 546 | S SUMMAP=SUMMAP_$S(%X1=1:"один",%X1=2:"два",%X1=3:"три",%X1=4:"четыре",%X1=5:"пять",%X1=6:"шесть",%X1=7:"семь",%X1=8:"восемь",%X1=9:"девять",1:"")_" " 547 | K E1,E2,E3,E4,E5,E6,E7,E8,E9 548 | Q ;PoDIN 549 | ]]> 550 | 551 |
552 |
553 | -------------------------------------------------------------------------------- /Version/CosNumberTranslation_v1.1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Initialize Global with number translate 6 | %RegisteredObject 7 | 64823,46825.955514 8 | 64812,56223.641124 9 | 10 | 11 | 1 12 | 183 | 184 | 185 | 186 | 187 | 188 | 190 | NumberTranslate.NumberTranslate 191 |

NumberTranslate

192 |

Overview

193 |

the aim of this function is to convert numbers into text.

194 |

It allows a maximum number of 15 digits.

195 |

The translation is done in several languages. The allowed languages are

196 |

    197 |
  • es: Spanish
  • 198 |
  • en: English
  • 199 |
  • ca: Catalan
  • 200 |
  • ru: Russian
  • 201 |

202 |

The function also allows to treat the numbers of 10^9 (millards) in English-speaking countries format. See the following link Billion Wikipedia

203 |

Example

204 |
205 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc)
206 | one hundred and twenty-three
207 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"es")
208 | ciento veintitres
209 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"ca")
210 | cent vint-i-tres
211 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",1)
212 | one billion
213 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000,.tSc,"en",0)
214 | one thousand millions
215 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",1)
216 | one trillion
217 | USER> w ##class(NumberTranslate.NumberTranslate).GetText(1000000000000,.tSc,"en",0)
218 | one billion
219 | 
220 |

In case of error, you can catch the error with the status variable 221 |

222 | USER> set text=##class(NumberTranslate.NumberTranslate).GetText(123,.tSc,"fr") 
223 | USER> if ('tSc) { w $System.Status.GetErrorText(tSc) } else { w text }        
224 | ERROR #420: Lang fr not exists
225 | 
226 | ]]>
227 | 0 228 | %RegisteredObject 229 | 64855,64797.226424 230 | 64812,55450.740429 231 | 232 | 233 | 234 | Internal method to get trio of digit and translate according to language 235 | pTrio:%String 236 | %String 237 | 0) 254 | { 255 | set figure=figure_$SELECT((lcent=1)&&((lten=0)&&(lunit=0)):^NumberTranslate("Config","lang",lang,"hundred"), 256 | 1:^NumberTranslate("Config","lang",lang,"hundred",lcent)) 257 | } 258 | 259 | if (lcent>0)&&((lten>0)||(lunit>0)) 260 | { 261 | set figure=figure_^NumberTranslate("Config","lang",lang,"concat-cents") 262 | } 263 | 264 | // Second figure (tens) 265 | if ((lten>=3)&&(lten<=9)) 266 | { 267 | set figure = figure_$SELECT(lunit=0:obj.GetDigit(lten*10)_" ",lunit>0:obj.GetDigit(lten*10)_^NumberTranslate("Config","lang",lang,"concat-tens")) 268 | } elseif (lten = 2) 269 | { 270 | set figure = figure_$SELECT(lunit=0:^NumberTranslate("Config","lang",lang,"unit",29)_" ",1:obj.GetDigit(lten*10)) 271 | // Condition only for Spanish and twenty 272 | if (lang'="es")&&(lunit>0) 273 | { 274 | set figure = figure_^NumberTranslate("Config","lang",lang,"concat-tens") 275 | } 276 | } elseif (lten = 1) 277 | { 278 | set figure = figure_" "_obj.GetDigit((lten*10)+lunit)_" " 279 | } 280 | 281 | // Third figure (unit) 282 | if ((lunit>0)&&(lten'=1)) 283 | { 284 | set figure = figure_obj.GetDigit(lunit) 285 | } 286 | 287 | 288 | // Remove all double spaces 289 | set figure=$Replace(figure," "," ") 290 | k obj 291 | quit figure 292 | ]]> 293 | 294 | 295 | 296 | 297 | Internal method to get the text of digit 298 | pNumber:%Integer 299 | %String 300 | 334 | 335 | 336 | 337 | 338 | Translate a number to text 339 | 1 340 | pNumber:%Decimal,*pStatus:%Status,pLang:%String="en",pEngBillion:%Boolean=0 341 | %String 342 | 1:obj.Trio(billion)_" "_textBlocks,1:"") 390 | } 391 | if (block=2) // (EUR) Thousand million / (ENG) Billion 392 | { 393 | // Acording to culture, the text could be billion or thousand (of billion) 394 | set textBlock=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billion"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 395 | set textBlocks=$CASE(pEngBillion,1:^NumberTranslate("Config","lang",pLang,"billions"),0:^NumberTranslate("Config","lang",pLang,"thousand")) 396 | 397 | set tResult=tResult_" "_$SELECT($Number(millard)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, $Number(millard)>1:obj.Trio(millard)_" "_textBlocks, 1:"") 398 | 399 | } 400 | if (block=3) // Million 401 | { 402 | set textBlock=^NumberTranslate("Config","lang",pLang,"million") 403 | set textBlocks=^NumberTranslate("Config","lang",pLang,"millions") 404 | 405 | set tResult=tResult_" "_$SELECT($Number(million)=1:^NumberTranslate("Config","lang",pLang,"unit")_" "_textBlock, 406 | $Number(million)>1:obj.Trio(million)_" "_textBlocks, 407 | $Number(millard)>0: $SELECT(pEngBillion=1:" ",1:" "_textBlocks),1:"") 408 | } 409 | if (block=4) // Thousand 410 | { 411 | set textBlock=^NumberTranslate("Config","lang",pLang,"thousand") 412 | 413 | set tResult=tResult_" "_$SELECT($Number(thousand)=1:textBlock, $Number(thousand)>1:obj.Trio(thousand)_" "_textBlock,1:"") 414 | } 415 | if (block=5) // Cents 416 | { 417 | set tResult=tResult_" "_obj.Trio(cents) 418 | } 419 | } 420 | 421 | k obj 422 | set tResult = $ZSTRIP($Replace(tResult," "," "),"<>"," ") 423 | Quit tResult 424 | ]]> 425 | 426 | 427 | 428 | 429 | перевод суммы в пропись 430 | 1 431 | summa:%Library.String="" 432 | %String 433 | 0 D PRUBL 444 | S V2=$E(%X,$L(%X)-1),V3=$E(%X,$L(%X)) 445 | I V3=1,V2'=1 S SUMMAP=SUMMAP_" рубль",VV=1 446 | I ((V3=2)!(V3=3)!(V3=4))&(V2'=1) S SUMMAP=SUMMAP_" рубля",VV=1 447 | I ((V3=1)!(V3=2)!(V3=3)!(V3=4))&(V2=1) S SUMMAP=SUMMAP_" рублей",VV=1 448 | I V3>4 S SUMMAP=SUMMAP_" рублей",VV=1 449 | I VV=0 S SUMMAP=SUMMAP_" рублей" 450 | S %X=$P(SUMMA,".",2) I %X="" S %X="00" 451 | I %X?1N S %X=%X_"0",(V1,V)="0" 452 | I %X?2N S V1=$E(%X,1,1),V=$E(%X,2,2) 453 | R1 I (V="1")&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейка" 454 | I ((V="2")!(V="3")!(V="4"))&(V1'="1") S SUMMAP=SUMMAP_" "_%X_" копейки" 455 | I ((V'="1")&(V'="2")&(V'="3")&(V'="4"))!(V1="1") S SUMMAP=SUMMAP_" "_%X_" копеек" 456 | I $E(SUMMAP)=" " S SUMMAP=$E(SUMMAP,2,255) 457 | S SUMMAP=$TR($E(SUMMAP),"одтчпшсвн","ОДТЧПШСВН")_$E(SUMMAP,2,255) 458 | END0 K %X,%X0,%X1,R0,R1 459 | Q (SUMMAP) ;1 460 | ;- 461 | PRUBL ; РУБЛИ 462 | D PMILR,PMILE,PtYS,PEDIN 463 | Q ;PRUBL 464 | ;- 465 | PMILR ;МИЛЛИАРД 466 | S %X0=%X\1000000000 Q:%X0=0 ;### 467 | D PSoT,PDES 468 | ;S SUMMAP=SUMMAP_"миллион"_$S(%X0#10=1:"",%X0#10>1&(%X0#10<5):"а",1:"ов")_" " 469 | RRR3 S SUMMAP=SUMMAP_" миллиард"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 470 | K R3 471 | Q ;PMILR 472 | ;- 473 | PMILE ;МИЛЛИОНЫ 474 | ;S %X0=%X\1000000 Q:%X0=0 ;### 475 | S %X0=%X#1000000000\1000000 Q:%X0=0 ;### 476 | D PSoT,PDES 477 | ;S SUMMAP=SUMMAP_"миллион"_$S(%X0#10=1:"",%X0#10>1&(%X0#10<5):"а",1:"ов")_" " 478 | R3 S SUMMAP=SUMMAP_" миллион"_$S(%X0#100=0:"ов",%X0#100>10&(%X0#100<21):"ов",%X0#10>1&(%X0#10<5):"а",%X0#10=1:"",1:"ов")_" " 479 | K R3 480 | Q ;PMILE 481 | ;- 482 | PtYS ;ТЫСЯЧИ 483 | S %X0=%X#1000000\1000 Q:%X0=0 ;### 484 | D PSoT,PDES 485 | S %X1=$E(SUMMAP,$L(SUMMAP)-2,$L(SUMMAP)) 486 | I %X1="ва " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"ве " 487 | I %X1="ин " S SUMMAP=$E(SUMMAP,1,$L(SUMMAP)-3)_"на " 488 | QQ S SUMMAP=SUMMAP_"тысяч"_$S(%X0#100=11:"",%X0#100=12:"",%X0#100=13:"",%X0#100=14:"",%X0#10=1:"а",%X0#10>1&(%X0#10<5):"и",1:"")_" " 489 | K R4,R5,R6 490 | Q ;PtYS 491 | ;- 492 | PEDIN ;ЕДИНИЦЫ В ОСТАТКЕ 493 | S %X0=%X#1000 Q:%X0=0 ;### 494 | D PSoT,PDES 495 | Q ;PtDIN 496 | ;- 497 | PSoT ;СОТНИ 498 | S %X1=%X0\100 Q:%X1=0 ;### 499 | R7 S S1="сто" 500 | R8 S S2="двести" 501 | R9 S S3="триста" 502 | R10 S S4="четыреста" 503 | R11 S S5="пятьсот" 504 | R12 S S6="шестьсот" 505 | R13 S S7="семьсот" 506 | R14 S S8="восемьсот" 507 | R15 S S9="девятьсот" 508 | S SUMMAP=SUMMAP_$S(%X1=1:S1,%X1=2:S2,%X1=3:S3,%X1=4:S4,%X1=5:S5,%X1=6:S6,%X1=7:S7,%X1=8:S8,%X1=9:S9)_" " 509 | K S1,S2,S3,S4,S5,S6,S7,S8,S9 510 | Q ;PSoT 511 | ;- 512 | PDES ;ДЕСЯТКИ 513 | S %X1=%X0#100\10 Q:%X=0 ;### 514 | I %X1=1 D PDC Q ;### 515 | R17 S D2="двадцать" 516 | R18 S D3="тридцать" 517 | R19 S D4="сорок" 518 | R20 S D5="пятьдесят" 519 | R21 S D6="шестьдесят" 520 | R22 S D7="семьдесят" 521 | R23 S D8="восемьдесят" 522 | R24 S D9="девяносто" 523 | S SUMMAP=SUMMAP_$S(%X1=2:D2,%X1=3:D3,%X1=4:D4,%X1=5:D5,%X1=6:D6,%X1=7:D7,%X1=8:D8,%X1=9:D9,1:"")_" " 524 | K D2,D3,D4,D5,D6,D7,D8,D9 525 | D PoDIN 526 | Q ;PDES 527 | ;- 528 | PDC ; 529 | S %X1=%X0#10 530 | R25 S F0="десять" 531 | R26 S F1="одиннадцать" 532 | R27 S F2="двенадцать" 533 | R28 S F3="тринадцать" 534 | R29 S F4="четырнадцать" 535 | R30 S F5="пятнадцать" 536 | R31 S F6="шестнадцать" 537 | R32 S F7="семнадцать" 538 | R33 S F8="восемнадцать" 539 | R34 S F9="девятнадцать" 540 | S SUMMAP=SUMMAP_$S(%X1=0:F0,%X1=1:F1,%X1=2:F2,%X1=3:F3,%X1=4:F4,%X1=5:F5,%X1=6:F6,%X1=7:F7,%X1=8:F8,%X1=9:F9) 541 | K F0,F1,F2,F3,F4,F5,F6,F7,F8,F9 542 | Q ;PDC 543 | ;- 544 | PoDIN ;ЕДИНИЦЫ 545 | S %X1=%X0#10 I %X1=0 Q ;### 546 | S SUMMAP=SUMMAP_$S(%X1=1:"один",%X1=2:"два",%X1=3:"три",%X1=4:"четыре",%X1=5:"пять",%X1=6:"шесть",%X1=7:"семь",%X1=8:"восемь",%X1=9:"девять",1:"")_" " 547 | K E1,E2,E3,E4,E5,E6,E7,E8,E9 548 | Q ;PoDIN 549 | ]]> 550 | 551 |
552 |
553 | --------------------------------------------------------------------------------