Spanish [SOLUCIONADO] Convertir String a entero en Android 5x (no es una pregunta, solo quiero compartir)

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola a todos:

Para muchos esto que os voy a comentar os puede parecer una obviedad, pero para los nuevos en B4A seguramente no, y por eso lo quiero compartir.

Para convertir un string a un entero (o a otro tipo) es tan facil como asignarlo:

B4X:
Dim MiString as String
Dim MiEntero as Int

MiString = "1"

MiEntero =  MiString

Hasta Android 5 si el valor del string era una cadena nula (MiString = ""), o no le asignabas valor no pasaba nada, pero en Android 5 sale un error, concretamente este:
java.lang.NumberFormatException: Invalid double: ""

Asi que para los que tengais este tipo de asignaciones y el string pueda quedar en una cadena nula, os recomiendo que lo corrijais antes que se te quejen en el Play Store :D

Hay mil formas de resolverlo, os pongo un par:

B4X:
Dim MiString = "0" as String
Dim MiEntero as Int

MiEntero =  MiString

' -----------------------------------------------

Dim MiString as String
Dim MiEntero as Int

if MiString = "" Then MiString = "0"

MiEntero =  MiString

Nota: Como que esto es mas un avisar que una pregunta, he puesto el [SOLUCIONADO] , y aprovechando que comparto esto con todos, por favor, cuando se os responda y se os solucione el problema de la pregunta, no cuesta nada modificar el Post y anteponer el [SOLUCIONADO] para que asi este foro sea mas fluido para encontrar respuestas. Y ya abusando un poco de vuestro tiempo :D, añadirlo a ese Post que nuestro amigo Heppy hace el esfuerzo de mantenerlo (gracias Angel):
Indice de temas con [Solucionado] o de gran interés
https://www.b4x.com/android/forum/threads/indice-de-temas-con-solucionado-o-de-gran-inter%C3%A9s-ultimo-saber-si-existe-una-columna-en-sqlite.44948/


Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Yo he tenido este problema y me gustaria plantear una pregunta sobre tu solucion.

En que momento da el error Iinvalid double: "" ?

Lo digo porque tu solucion propone que si MyString="" entonces MyString="0". Pero entiendo que si de la condicion para poner en marcha la solucion entonces es porque ya tenemos el problema generado, es decir MyString ya vale "". Por eso deduzco que el mero hecho de que sea "" no da el error sino que esto sucede en algun otro momento. Al leerlo?, al usarlo? cuando? No se si me explicado bien.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

El error sucede cuando asignas el string al entero y este es cadena nula (pero como dije en Android 5.1.x), por eso una buena forma para no olvidarse es cuando lo declaras (Dim MiString = "0" as String ) , te pongo en el ejemplo donde saltaria el error:

B4X:
Dim MiString as String
Dim MiEntero as Int

MiEntero = MiString ' en este caso lo daria aqui, al asignarlo por que MiString = "" (cadena nula)

' ----------------------------------------------------------

' Si antes de asignarlo lo cambias está claro que no te dará el error
Dim MiString as String
Dim MiEntero as Int

if MiString = "" Then MiString = "0" ' o el valor que creas conveniente
MiEntero = MiString 

' ----------------------------------------------------------
' o cuando lo declaras
Dim MiString = "0" as String

Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Ok, me queda claro cuando da el error.

Tu dices que esto pasa a partir de Android 5. Yo tengo una pequeña APP y me sale ese mismo error pero en un telefono con 4.3...me es muy dificil identificarlo porque no sale siempre sino escasas veces. Supongo que es cuando al recibir por BT un contador separado por comas (345,346,347...) al querer aislar el entero algo hago mal.

A que se puede deber entonces el error?
Hay algun lugar con lista de errores y excepciones?
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Desafortunadamente como habras podido sufrir :D , los errores son un poco dificiles de entender sin mas ya que vienen de la compilación.

Ejecuta el programa en debug (rapid), y cuando se produzca el error te dirá en que linea de tu codigo se ha producido. Pon log donde sospeches que puede estar el error y que el log te de los valores.
Si con esto no lo consigues por que necesitas que el programa se ejecute en release, create un fichero de traza, y deriva tus logs a este fichero, asi podras ejecutar el programa normalmente, y cuando falle cazaras el error.

Si no lo tienes claro abre un post de como hacer un fichero de traza y te lo pongo, no lo quiero poner aqui por que solo lo verian quien fuera a mirar este post, y no quien quisiera saber como hacer un fichero de traza simple. Por otro lado es algo que seguramente sabes hacer.

Saludos
 

cas6678

Active Member
Licensed User
Longtime User
Me parece muy interesante tu propuesta, ya abierto el post.

En mi caso el error no de produce siempre. La aplicacion funciona bien durante mucho tiempo y de repente, sin hasta ahora entender por que me falla.

Se trata de una lectura que hago con
B4X:
Sub AStreams_NewData (Buffer() As Byte)
de un contandor que mando por bluetooth desde Arduino, del tipo (..4567,4568,4569,4570,...etc.). El tema es que como este contandor va muy rapido no siempre lee un numero entero, p.e. 4569, si no que a veces la lectura puede ser p.e 568,4569,45. de ahi que me invente un protocolo para que "aisle" el entero entre comas y en algun momento el tema peta...pero no soy capaz de ver cuando para poder localizarlo y corregirlo. Si pasara mas a menudo con unos cuantos log podria pero igual pasa cada al minuto que a la hora.

Saludos y gracias por tus respuestas.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Ya te escribí la traza en el otro post (https://www.b4x.com/android/forum/threads/como-hacer-un-fichero-de-traza.59025/) , veras que es una simpleza, pero muy util para estos casos como el tuyo.

Yo lo que haria, seria hacer una llamada antes y despues de tratar esa variable, y asi sabras que valor tenia y que valor le diste despues de tratarla. No se, algo asi:

B4X:
  MiBuffer = LeodelBuffer
  
  ModuloDondeEsteLaTraza.GrabarTraza("Buffer antes de tratar: " & MiBuffer)

  BufferTratado = IraTratarBuffer

  ModuloDondeEsteLaTraza.GrabarTraza("Buffer una vez tratado: " & BufferTratado)

De esta forma sabes que valores tienes antes y despues. Si dentro del tratamiento del buffer haces algo que no estes muy seguro que pueda funcionar, haz lo mismo y llama a grabar los valores

Saludos
 
Top