NumtoWord (in a payment receipt)

Post Reply
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

NumtoWord (in a payment receipt)

Post 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
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: NumtoWord (in a payment receipt)

Post by nageswaragunupudi »

Not corrected yet.
I will consult you later on this.
Regards

G. N. Rao.
Hyderabad, India
User avatar
MaxP
Posts: 85
Joined: Thu Jul 12, 2007 2:02 pm
Contact:

Re: NumtoWord (in a payment receipt)

Post 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
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

Re: NumtoWord (in a payment receipt)

Post by Silvio.Falconi »

grazie massimo. Provato e funziona bene era proprio quello che in italia serve
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
Post Reply