Page 1 of 1

uCharToVal()

Posted: Thu Jan 30, 2025 6:20 pm
by FiveWiDi
Hola a todos,

Yo tenía entendido que haciendo esto:
uMiValor := uCharToVal( uMiValor, MiOtroValor )

uMiValor se convertía al tipo de uMiOtroValor

Es decir que si ValType( uMiOtroValor ) era N, entonces:
uMiValor := uCharToVal( uMiValor, MiOtroValor )

era lo mismo que:
uMiValor := Val( uMiValor )

Pués resulta que esto:
uMiValor := uCharToVal( uMiValor, "N" )

hace los mismo que esto:
uMiValor := uCharToVal( uMiValor, 28 )
(28 o cualquier otro número)

En fin, hace años esta función ya me hizo la pirula.

Re: uCharToVal()

Posted: Thu Jan 30, 2025 9:28 pm
by Antonio Linares
Carlos,
/**
* Convierte una cadena de texto en un valor de un tipo específico.
*
* @param {string} cText - El texto a convertir.
* @param {string} cType - El tipo de conversión deseado ('C' para cadena, 'N' para número, 'L' para lógico, 'D' para fecha, 'M' tratado como 'C').
*
* @returns {any} - Devuelve el valor convertido según el tipo especificado o inferido.
*
* @description
* La función toma una cadena de texto y la convierte al tipo de dato especificado en `cType`.
* Si `cType` no es válido, se intenta inferir el tipo de dato.
*
* - Si `cType` es 'C', el valor devuelto es la cadena original sin espacios al inicio y al final.
* - Si `cType` es 'N', intenta convertir la cadena a un número.
* - Si `cType` es 'L', determina si la cadena representa un valor lógico ('T'/True o 'F'/False en varios idiomas).
* - Si `cType` es 'D', intenta convertir la cadena a una fecha.
* - Si no se especifica un tipo válido, se infiere el tipo a partir del contenido de `cText`.
*
* @example
* uCharToVal("123", "N") // Devuelve 123 como número
* uCharToVal("true", "L") // Devuelve .T. (true en Harbour)
* uCharToVal("2024-01-01", "D") // Devuelve una fecha
* uCharToVal("Hello", "C") // Devuelve "Hello"
*/

Re: uCharToVal()

Posted: Thu Jan 30, 2025 11:23 pm
by FiveWiDi
Supuse que andaba por ahí la cosa, y he acertado.

Muchas gracias Antonio,

Re: uCharToVal()

Posted: Fri Jan 31, 2025 12:13 pm
by nageswaragunupudi
In many cases, the function works well even without specifying the type in the 2nd parameter

Sample:

Code: Select all | Expand

function TestStr2Val()

   local aStr  := { "34512.01", "1,234.56", "3.456,34", "12.5%", "true", "FALSO",  ;
                    "10/20/2020", "25-02-1998", "10 jan 2010", "feb 15, 78" }

   SET DATE ITALIAN
   SET CENTURY ON
   FWNumFormat( "A", .t. )


   AEval( aStr, { |c,i| aStr[ i ] := { c, uCharToVal( c ), nil } } )
   AEval( aStr, { |a,i| a[ 3 ] := ValType( a[ 2 ] ) } )


   XBROWSER aStr TITLE "uCharToVal(c)" SETUP ( ;
      oBrw:cHeaders := { "FUNCTION", "RESULT", "TYPE" }, ;
      oBrw:aCols[ 1 ]:bStrData := { |x,o| 'uCharToVal( "' + o:Value + '" ) =' }, ;
      oBrw:aCols[ 1 ]:nDataStrAlign := AL_RIGHT, ;
      oBrw:aCols[ 3 ]:nDataStrAlign := AL_CENTER )

return nil
Image