Considerar puntos decimales.

Bien tengo el siguiente problema:
Tengo un cursor "cCursor" y tiene algunos campos, uso aFields para tener el número de campos y hago un ciclo para ir pegando cada campo en una línea que después escribiré en un txt, un ejemplo de línea final es:
|RFC900112GH2|AF|2|1|04/10/10 17:41:07|608|84|1|I|
Es aquí donde viene el problema:
Los 3 últimos números antes de la I son precios, por lo que deberían estar como:
608.56|84.00|1.00
yo tengo el siguiente código:
for i = 1 to nCampos
        cValor = evaluate("RepMensual." + RepMensual[i,1])
        if !isnull(cValor)
           if !type("cValor") = "C"
                 if type("cValor") = "T"
                    cTextoAEscribir = cTextoAEscribir + "|" + ttoc(cValor)
                 else
                    cTextoAEscribir = cTextoAEscribir + "|" + alltrim(str(cValor))
                 endif
           else
              cTextoAEscribir = cTextoAEscribir + "|" + alltrim(cValor)
           Endif
        Endif
    Endfor
Lo que necesito hacer es hacer otro caso para cuando el valor sea numérico y tenga puntos decimales entonces no usar string sino transform, mi duda es:
¿Cómo puedo saber si el valor trae punto decimal?
Muuuuuuuuchas gracias de antemano...

1 respuesta

Respuesta
1
Mi primer intento para resolver el problema:
¿Has probado con ponerle parámetros adicionales al str() de forma que también incluya los decimales como resultado de su transformación?
En la ventana de comandos por ejemplo tengo:
local  x as double
x=608.23
MESSAGEBOX(ALLTRIM(STR(x, 8,2)))
Me devuelve "608.23".
Avísame.
Bien tengo el siguiente problema:
Tengo un cursor "cCursor" y tiene algunos campos, uso aFields para tener el número de campos y hago un ciclo para ir pegando cada campo en una línea que después escribiré en un txt, un ejemplo de línea final es:
|RFC900112GH2|AF|2|1|04/10/10 17:41:07|608|84|1|I|
Es aquí donde viene el problema:
Los 3 últimos números antes de la I son precios, por lo que deberían estar como:
608.56|84.00|1.00
yo tengo el siguiente código:
for i = 1 to nCampos
        cValor = evaluate("RepMensual." + RepMensual[i,1])
        if !isnull(cValor)
           if !type("cValor") = "C"
                 if type("cValor") = "T"
                    cTextoAEscribir = cTextoAEscribir + "|" + ttoc(cValor)
                 else
                    cTextoAEscribir = cTextoAEscribir + "|" + alltrim(str(cValor))
                 endif
           else
              cTextoAEscribir = cTextoAEscribir + "|" + alltrim(cValor)
           Endif
        Endif
    Endfor
Lo que necesito hacer es hacer otro caso para cuando el valor sea numérico y tenga puntos decimales entonces no usar string sino transform, mi duda es:
¿Cómo puedo saber si el valor trae punto decimal?
Muuuuuuuuchas gracias de antemano...
De acuerdo, si, se que esa instrucción funciona bien la duda o el problema que tengo es: ¿Cómo se de antemano que el número que voy a convertir a string trae o no puntos decimales?
Por ejemplo:
Tengo estos números en un arreglo xArreglo:
xArreglo [0] = {1}
xArreglo [1] = {3}
xArreglo [2] = {55.78}
xArreglo [3] = {15.69}
Ahora lo que hago es hacer un cliclo para leerlos todos y dejarlos así:
cResultado = "|1|3|55.78|15.69|"
Eso es lo que necesito hacer y el problema es a xArreglo [0] y a xArreglo [1] tengo que hacer un alltrim(str(nValor)) pero a xArreglo [2] y a xArreglo [3] tengo que hacer lo que mencionas: ALLTRIM(STR(x, 8,2))
Mi duda es: ¿Qué puedo usar para saber si el valor del arreglo que estoy evaluando trae o no punto decimal para entonces yo saber si aplico str() o str(, 8,2)?
Muchas muchas gracias...
Puedes hacerlo así:
DIMENSION xArreglo(5)
LOCAL lcCadena as String
xArreglo(1)= 3
xArreglo(2)= 55.78
xArreglo(3)= 15.69
xArreglo(4)= 1
xArreglo(5)= 4
lcCadena=""
FOR x=1 TO 5
    IF (INT(xArreglo(x))-xArreglo(x))<>0
        lcCadena=lcCadena+"|"+ALLTRIM(STR(xArreglo(x),8,2))
    ELSE
        lcCadena=lcCadena+"|"+ALLTRIM(STR(xArreglo(x)))
    ENDIF
Endfor
MESSAGEBOX(lcCadena)
Avísame.
Bien pues si, también lo pensé, sin embargo eso funciona para cuando el punto decimal sea mayor a 0 pero si mi precio es 55.00, entonces ya no funciona porque me va a hacer solo el str(x) y entonces el resultado obtenido sería 55. Pues no quedó como yo quería pues lo quería hacer más general pero bueno a fin de cuentas conozco los nombres de los campos así que lo resolví así:
select ('RepMensual')
nCampos = afields(RepMensual)
scan
    if !empty(cTextoAEscribir)
       cTextoAEscribir = cTextoAEscribir + "|" + chr(13) + chr(10) + chr(13)
    endif
    for i = 1 to nCampos
        cValor = evaluate("RepMensual." + RepMensual[i,1])
        if !isnull(cValor)
           do case
              case type("cValor") = "C"
                     cTextoAEscribir = cTextoAEscribir + "|" + alltrim(cValor)
              case type("cValor") = "T"
                     cTextoAEscribir = cTextoAEscribir + "|" + ttoc(cValor)
              case type("cValor") = "N"
                     if RepMensual[i,1] = "TOTAL" or RepMensual[i,1] = "IVA"
                           cTextoAEscribir = cTextoAEscribir + "|" + alltrim(transform(cValor,"999999999999.99"))
                     else
                        cTextoAEscribir = cTextoAEscribir + "|" + alltrim(str(cValor))
                     Endif
           Endcase
        Endif
    Endfor
Endscan
cTextoAEscribir = cTextoAEscribir + "|"
Muchas muchas gracias por las molestias y la atención!
Una decisión salomónica.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas