Decimal detection

Post Reply
Marc Vanzegbroeck
Posts: 1163
Joined: Mon Oct 17, 2005 5:41 am
Location: Belgium
Contact:

Decimal detection

Post by Marc Vanzegbroeck »

Hi,

I want to convert some values from a database to a text file for export use.

Normaly a use str() to convert the value.

The problem is that if the field is define with 5 Decimals, and the value is 4.204, the export is 4.20400.
Then I can use something like str(10,3).
Is there a easy way to know the amount of decimals used? So when the value is 4.20000 is -return 4.2, 4.25600, return 4.256?
Regards,
Marc

FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
User avatar
FranciscoA
Posts: 2163
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Decimal detection

Post by FranciscoA »

Hi.
WhatsNew Fwh2106 contains this:
* Función FW_ExcelToDBF(): Elimina los ceros a la derecha después del decimal al
convertir números a texto.

Maybe it can help you.
Regards
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Decimal detection

Post by James Bott »

Code: Select all | Expand

Function RemoveZeros( cValue )
   do while right(cValue,1) = "0"
      cValue:= left(cValue, len(cValue) -1)
   enddo
Return cValue
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
FranciscoA
Posts: 2163
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Decimal detection

Post by FranciscoA »

Code: Select all | Expand

function RemoveRightZeros(cString)
  local nPos := 0, n, nLen := Len(cString)

  if ValType(cString) <> "C"
     MsgStop("El valor recibido debe ser del tipo Cadena de texto", "Alto")
     Return ""
  endif

  FOR n := 1 TO nLen
     if RIGHT(cString,n,1) <> "0"
        nPos := nLen - (n-1)
        exit
     endif
  END

RETURN MsgInfo( SUBSTR(cString, 1, nPos), cString )
 
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
Marc Vanzegbroeck
Posts: 1163
Joined: Mon Oct 17, 2005 5:41 am
Location: Belgium
Contact:

Re: Decimal detection

Post by Marc Vanzegbroeck »

James, Francisco,

Thank you, they both are working fine.
The only thing was that if there was a value without decimal digits it returns the value with a dot.

Like '122.00000' returns '122.'

I will optimize it with testing if the return-value ends with '.', if so, I will return it without the '.'
Regards,
Marc

FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Decimal detection

Post by James Bott »

Marc,

Here it is with the new revisions you mentioned.

James

Code: Select all | Expand

/*
Purpose  :  Reformat number in string format
Program  :
Author   : James Bott, jbott@compuserve.com
Date     :
Company  : Intellitech
Language : Fivewin/xHarbour
Updated  :
Notes    :

*/


#include "fivewin.ch"

Function Main()

   Local cValue:= "122.000"
   
   msgInfo( RemoveZeros(cValue) )
   
   cValue := "122.220"
   
   msgInfo( RemoveZeros(cValue) )
   
   quit
   
Return nil

// Reformat number in string format (cValue)
Function RemoveZeros( cValue )

   // Remove trailing zeros
   do while right(cValue,1) = "0"
      cValue:= left(cValue, len(cValue) -1)
   enddo
   
   // Remove trailing decimal point
   if right(cValue,1) = "."
      cValue:= left(cValue,len(cValue)-1)
   endif
   
Return cValue
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Decimal detection

Post by nageswaragunupudi »

Code: Select all | Expand


cNum := Str( .... )
cTrim := If( "." $ cNum, RemRight( RemRight( cNum, "0" ), "." ), cNum )
 


OR
Simply use the FWH built-in function

Code: Select all | Expand


cNum := cNumToStr( nValue, .f., .f. )
 

instead of using cNum := Str( nValue )
Regards

G. N. Rao.
Hyderabad, India
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Decimal detection

Post by James Bott »

Nages,

cNum := cNumToStr( nValue, .f., .f. )

Wow, one line, I like that! Less is more.

I note that in my version of FWH 1805, it is not listed in the documentation, but the function is in version 1805. You might want to check to make sure it is in the documentation for the latest version.

Please tell us what the 3rd and 4th parameters are.
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Decimal detection

Post by nageswaragunupudi »

Code: Select all | Expand

cNumToStr( nVal, [lEuropean], [lThouSep] )

2nd and 3rd parameters default to settings by FWNumFormat(...)
Regards

G. N. Rao.
Hyderabad, India
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Decimal detection

Post by James Bott »

Marc,

... '122.00000' returns '122.'


I should point out that technically 122.00000 is not the same as 122.

"122.00000" implies that it is accurate to the nearest 5th decimal place (one hundred thousandth of a unit). And 122 implies it is accurate to the nearest whole number. I know that database number formats aren't setup to deal with this issue so it is something to keep in mind.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
User avatar
James Bott
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Re: Decimal detection

Post by James Bott »

Marc,

I should have included this in my previous message. Below is the info for the Round() function from the Clipper manual. Depending on the real accuracy of the numbers you are converting, this should be used to get the proper whole number for your translation.

James

ROUND()
Return a numeric value rounded to a specified number of digits
------------------------------------------------------------------------------
Syntax

ROUND(<nNumber>, <nDecimals>) --> nRounded

Arguments

<nNumber> is the numeric value to be rounded.

<nDecimals> defines the number of decimal places to retain.
Specifying a negative <nDecimals> value rounds whole number digits.

Returns

ROUND() returns a numeric value.

Description

ROUND() is a numeric function that rounds <nNumber> to the number of
places specified by <nDecimals>. Specifying a zero or negative value
for <nDecimals> allows rounding of whole numbers. A negative
<nDecimals> indicates the number of digits to the left of the decimal
point to round. Digits between five to nine (inclusive) are rounded up.
Digits below five are rounded down.

The display of the return value does not obey the DECIMALS setting
unless SET FIXED is ON. With SET FIXED OFF, the display of the return
value contains as many decimal digits as you specify for <nDecimals>, or
zero, if <nDecimals> is less than one.

Examples

. These examples round values with decimal digits:

SET DECIMALS TO 2
SET FIXED ON
//
? ROUND(10.4, 0) // Result: 10.00
? ROUND(10.5, 0) // Result: 11.00
? ROUND(10.51, 0) // Result: 11.00
? ROUND(10.49999999999999, 2) // Result: 10.50

. These examples use a negative <nDecimals> argument to round
numeric values to whole number values:

? ROUND(101.99, -1) // Result: 100.00
? ROUND(109.99, -1) // Result: 110.00
? ROUND(109.99, -2) // Result: 100.00

Files Library is CLIPPER.LIB.
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Post Reply