Page 1 of 1

NumtoWord (in a payment receipt)

Posted: Sun May 10, 2020 4:24 pm
by Silvio.Falconi
I made :

FWNumFormat( "E", .t. ) // European format
FW_N2WSETUP( 6 ) //Italian


...


oPrn:cmSay( 3.2,8.6,FW_NUMTOWORDS(nImporto,"Euro", "centesimi" ), oFnt3 )

and I have this
Image

the problems is ( on italian language )
1. although I specified "euro" and not "euros" the function continues to print "Euros"
2. the word "cents" should be placed at the end and not after the "e" and before the cents value
3. In Italian the cents must be printed with a slash "/" instead of the "e"
4. there must be no spaces between words , or there must be an option to separate words sample lSeparation

so the sentence should be printed like this:

Euro trecentocinquantacinque/67
or
Euro trecentocinquantacinque/67 centesimi

at this url https://www.blia.it/cifralettere/ there is a test that transcribes the amounts in Italian

To write the amount in letters, the cents must be written in numbers after a bar.

Example:

- 150 euro e 25 cent are written centocinquanta/25 (150.25)

- 150 euro are written centocinquanta/00 ( 150.00)

Other notations such as:

- centoventicinque/13 centesimi (125.13)
- centoventicinque e tredici centesimi (125.13)
- centoventicinque e 13 centesimi (125.13)
- centoventicinque e tredici cent (125.13)
- centocinquanta no cent ( 150.00)




on Jun 06, 2017 on this topic http://forums.fivetechsupport.com/viewt ... ds#p202527

I allready explained the errors for Italian language

it probably hasn't been fixed yet

Re: NumtoWord (in a payment receipt)

Posted: Mon May 11, 2020 5:39 am
by nageswaragunupudi
Not corrected yet.
I will consult you later on this.

Re: NumtoWord (in a payment receipt)

Posted: Mon May 11, 2020 8:53 am
by MaxP
Hi Silvio,

this is a function Gl_NumToE( nNum ) to get a italian word from a number

Code: Select all

#include "FiveWin.ch"


FUNCTION MAIN()
        LOCAL   nNum1 := 12345.67, nNum2 := 1234567.89

        MsgStop( Gl_NumToE( nNum1 ) )
        MsgStop( Gl_NumToE( nNum2 ) )
RETURN NIL

/***************************************************************/

FUNCTION Gl_NumToE( nNum )
        LOCAL   cBuf := Gl_NumToL( INT( nNum ) ), cDec

        IF EMPTY( cBuf )
                cBuf := "Zero"
        ENDIF

        cDec := RIGHT( STR( nNum - INT( nNum ), 16, 5 ), 5 )
        IF RIGHT( cDec, 1 ) == "0"
                cDec := LEFT( cDec, 4 )
        ENDIF
        IF RIGHT( cDec, 1 ) == "0"
                cDec := LEFT( cDec, 3 )
        ENDIF
        IF RIGHT( cDec, 1 ) == "0"
                cDec := LEFT( cDec, 2 )
        ENDIF
RETURN cBuf + " / " + cDec

FUNCTION Gl_NumToL( nNum )
        LOCAL   cBuf := "", lNeg := .F., nLen, cStr := ""

        cBuf := ALLTRIM( STR( nNum ) )
        IF LEFT( cBuf, 1 ) == "-"
                cBuf := RIGHT( cBuf, LEN( cBuf ) - 1 )
                lNeg := .T.
        ENDIF

        IF VAL( cBuf ) == 1
                Vett1( 1, @cStr )
        ELSE
                IF ( nLen := LEN( cBuf ) ) < 9
                        cBuf := SPACE( 9 - nLen ) + cBuf
                ENDIF
                Tr__num( SUBSTR( cBuf, 1, 3 ), @cStr, 1 )
                Tr__num( SUBSTR( cBuf, 4, 3 ), @cStr, 2 )
                Tr__num( SUBSTR( cBuf, 7, 3 ), @cStr, 3 )
        ENDIF

        cStr := UPPER( LEFT( cStr, 1 ) ) + RIGHT( cStr, LEN( cStr ) - 1 )

        IF lNeg
                cStr := "Meno " + cStr
        ENDIF
RETURN cStr

STATIC FUNCTION Tr__num( cStr, cBuf, nType )
        LOCAL   cTmp, nVal, nNum

        cTmp := cStr
        IF ( nNum := VAL( cTmp ) ) > 0
                IF .NOT. LEFT( cStr, 1 ) == '0' .AND. .NOT. LEFT( cStr, 1 ) == ' '
                        IF .NOT. LEFT( cStr, 1 ) == '1'
                                Vett1( ASC( LEFT( cStr, 1 ) ) - 48, @cBuf )
                        ENDIF
                        cBuf += "cento"
                ENDIF
                cTmp := SUBSTR( cStr, 2, 2 )
                nVal := VAL( cTmp )
                IF nVal > 0
                        IF nVal < 20
                                IF nType == 1 .OR. nNum > 1
                                        Vett1( nVal, @cBuf )
                                ENDIF
                        ELSE
                                IF SUBSTR( cStr, 3, 1 ) == '0'
                                        Vett2( SUBSTR( cStr, 2, 1 ), @cbuf )
                                ELSE
                                        IF SUBSTR( cStr, 3, 1 ) == '1'
                                                Vett2( SUBSTR( cStr, 2, 1 ), @cbuf )
                                                Coll( @cBuf, "uno" )
                                        ELSE
                                                IF SUBSTR( cStr, 3, 1 ) == '8'
                                                        Vett2( SUBSTR( cStr, 2, 1 ), @cbuf )
                                                        Coll( @cBuf, "otto" )
                                                ELSE
                                                        Vett2( SUBSTR( cStr, 2, 1 ), @cbuf )
                                                        Vett1( ASC( SUBSTR( cStr, 3, 1 ) ) - 48, @cBuf )
                                                ENDIF
                                        ENDIF
                                ENDIF
                        ENDIF
                ENDIF
                IF nType <> 3
                        IF ( nVal := LEN( cBuf ) ) > 2
                                IF RIGHT( cBuf, 3 ) == "uno"
                                        cBuf := LEFT( cBuf, nVal - 1 )
                                ENDIF
                        ENDIF
                        IF nNum > 1
                                cBuf += IIF( nType == 1, "milioni", "mila" )
                        ELSE
                                cBuf += IIF( nType == 1, "milione", "mille" )
                        ENDIF
                ENDIF
        ENDIF
RETURN NIL

STATIC FUNCTION Vett1( nNum, cCifra )
        LOCAL   cBuf

        DO CASE
                CASE nNum == 1
                        cBuf := "uno"

                CASE nNum == 2
                        cBuf := "due"

                CASE nNum == 3
                        cBuf := "tre"

                CASE nNum == 4
                        cBuf := "quattro"

                CASE nNum == 5
                        cBuf := "cinque"

                CASE nNum == 6
                        cBuf := "sei"

                CASE nNum == 7
                        cBuf := "sette"

                CASE nNum == 8
                        cBuf := "otto"

                CASE nNum == 9
                        cBuf := "nove"

                CASE nNum == 10
                        cBuf := "dieci"

                CASE nNum == 11
                        cBuf := "undici"

                CASE nNum == 12
                        cBuf := "dodici"

                CASE nNum == 13
                        cBuf := "tredici"

                CASE nNum == 14
                        cBuf := "quattordici"

                CASE nNum == 15
                        cBuf := "quindici"

                CASE nNum == 16
                        cBuf := "sedici"

                CASE nNum == 17
                        cBuf := "diciassette"

                CASE nNum == 18
                        cBuf := "diciotto"

                CASE nNum == 19
                        cBuf := "diciannove"
        ENDCASE

        Coll( @cCifra, cBuf )
RETURN NIL

STATIC FUNCTION Vett2( cCar, cCifra )
        LOCAL   cBuf

        DO CASE
                CASE cCar == '2'
                        cBuf := "venti"

                CASE cCar == '3'
                        cBuf := "trenta"

                CASE cCar == '4'
                        cBuf := "quaranta"

                CASE cCar == '5'
                        cBuf := "cinquanta"

                CASE cCar == '6'
                        cBuf := "sessanta"

                CASE cCar == '7'
                        cBuf := "settanta"

                CASE cCar == '8'
                        cBuf := "ottanta"

                CASE cCar == '9'
                        cBuf := "novanta"

        ENDCASE

        Coll( @cCifra, cBuf )
RETURN NIL

STATIC FUNCTION Coll( cCifra, cBuf )
        LOCAL   nLen, cCar1, cCar2

        IF ( nLen := LEN( cCifra ) ) > 0
                cCar1 := RIGHT( cCifra, 1 )
                cCar2 := LEFT( cBuf, 1 )

                IF ( cCar1 == 'a' .OR. cCar1 == 'e' .OR. ;
                 cCar1 == 'i' .OR. cCar1 == 'u' .OR. cCar1 == 'o' ) .AND. ;
                  ( cCar2 == 'a' .OR. cCar2 == 'e' .OR. ;
                   cCar2 == 'i' .OR. cCar2 == 'u' .OR. cCar2 == 'o' )
                        cCifra := LEFT( cCifra, nLen - 1 )
                endif
        ENDIF
        cCifra += cBuf
RETURN NIL
Regards
Massimo

Re: NumtoWord (in a payment receipt)

Posted: Mon May 11, 2020 4:31 pm
by Silvio.Falconi
grazie massimo. Provato e funziona bene era proprio quello che in italia serve