¿Cuál es la mejor manera de tomar una cadena que puede estar vacía o contener "1.2" por ejemplo, y convertirla a un número entero? int.TryParse
falla, por supuesto, y no quiero usar float.TryParse
y luego convertir a int
.C# Conversión de una cadena que contiene un punto flotante en un entero
Respuesta
Solución 1: Convert.ToDouble
(dependiente de la cultura)
Es posible que el uso de Convert.ToDouble
. ¡Pero cuidado! La siguiente solución funcionará solo cuando el separador de números en la configuración de la cultura actual sea un carácter de punto.
var a = (int)Convert.ToDouble("1.2");
Solución 2: Convert.ToDouble
(independiente del cultivo)
Es preferible utilizar IFormatProvider
y convertir el número de una manera independiente de los ajustes actuales de cultivo:
var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat);
Solución 3: Analizar & Dividir
Otra forma de realizar esta tarea es utilizar Dividir en una cadena analizada:
var a = int.Parse("1.2".Split('.')[0]);
O:
var a = int.Parse("1.2".Split('.').First());
Notas
- Si desea gestionar las cadenas vacías y nulos, escribir un método y agregar una cadena.
IsNullOrEmpty
condición. - Para obtener un separador decimal para la configuración de cultivo actual, puede usar la propiedad
NumberFormatInfo.NumberDecimalSeparator
. - También debe tener en cuenta rounding para evitar traps.
- Seleccionar fundición,
Parse
,TryParse
oConvert
clase sabiamente. Lea más en:
+1. Especialmente para decir que 'Convert.ToDouble' utiliza el delimitador decimal de la configuración de la cultura del hilo (de forma predeterminada la configuración regional de Windows), y puede ser una coma. Puede obligarlo a usar un punto pasando 'CultureInfo.InvariantCulture.NumberFormat' – MarkJ
Tal vez pueda intentar eliminar todo después del punto flotante utilizando las funciones de cadena y luego convertir a int. Pero en serio, no creo que sea mejor que convertir a float y luego a int.
No sé qué le pasa a analizar a un float
y convertir a un int
. Dudo que cualquier otra forma sería más eficiente, pero esto es un intento:
//allows empty strings and floating point values
int ParseInt(string s, bool alwaysRoundDown = false)
{
//converts null/empty strings to zero
if (string.IsNullOrEmpty(s)) return 0;
if (!s.Contains(".")) return int.Parse(s);
string parts = s.Split(".");
int i = int.Parse(parts[0]);
if (alwaysRoundDown || parts.Length==1) return i;
int digitAfterPoint = int.Parse(parts[1][0]);
return (digitAfterPoint < 5) ? i : i+1;
}
Con el fin de globalizar el código que se necesita para reemplazar "."
con System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
.
Creo que otra forma de hacerlo sería dividir la cadena en pedazos tomando el decimal (.) Como el delimitador y luego analizar el entero. Por supuesto, aún no he preguntado si la cadena podría contener valores como "37.56 miles in 32.65 seconds"
type values.
Teniendo en cuenta que habrá un solo valor (cadena o número) en la cadena, se me ocurre algo en la línea siguiente:
public int64 GetInt64(string input)
{
if (string.IsNullOrEmpty(input)) return 0;
// Split string on decimal (.)
// ... This will separate all the digits.
//
string[] words = input.Split('.');
return int.Parse(words[0]);
}
Quizás no sea necesario devolver int64 al hacer un análisis int32. – btlog
int a = (int)Math.Round(float.Parse("0.9"));
Es necesario redondear primero a menos que desee 0,9 f se convierte a 0 en lugar de 1.
Puede usar la Biblioteca de tiempo de ejecución de Visual Basic para lograr esto desde C#.
Debe agregar una referencia al ensamblado Microsoft.VisualBasic.dll a su solución.
A continuación, el siguiente código hará que su conversión:
using VB = Microsoft.VisualBasic.CompilerServices;
class Program
{
static void Main(string[] args)
{
int i = VB.Conversions.ToInteger("1.2");
}
}
tenía este mismo problema y terminó utilizando un híbrido de Marcos y Dariusz ':
if (num == "")
{
num = "0.00";
}
var num1 = (float)Convert.ToDouble(num);
- 1. Conversión de punto flotante a punto fijo
- 2. ¿Está garantizado que "(flotante) entero == entero" será igual en C#?
- 3. Comprobar variable doble si contiene un entero, y punto flotante no
- 4. Precise punto flotante <-> conversión de cadena
- 5. Conversión de un entero en una cadena hexadecimal en Ruby
- 6. Conversión de excepciones de punto flotante en excepciones de C++
- 7. la conversión de una cadena que contiene decimal a largo
- 8. Java flotante de conversión a entero
- 9. Cadena Convertir contiene una identificación en un entero Id
- 10. ¿Convertir variable de punto flotante a entero?
- 11. Haskell: leer un número (entero o punto flotante)
- 12. Conversión de entero en cadena
- 13. conversiones de tipo de punto flotante C++ a entero
- 14. Verificar si una cadena contiene un número entero
- 15. Conversión de cadena a entero
- 16. Entero Conversión en C#
- 17. ¿Cómo puedo convertir una cadena en un flotante en mysql?
- 18. Cómo insertar una cadena que contiene un "&"
- 19. convierte una cadena a un entero
- 20. Emular el comportamiento de conversión de cadena de punto flotante de Linux en Windows
- 21. Cómo saber si un GraphicsPath contiene un punto en C#
- 22. Signo de un número de punto flotante
- 23. Extraiga números de punto flotante de una cadena en PHP
- 24. Valor entero de tipo flotante en C
- 25. Conversión de punto flotante de 32 bits a 16 bits
- 26. la conversión de un entero a binario en C
- 27. precisión de punto flotante en Visual C++
- 28. ¿Puedo comparar y agregar un número de coma flotante a un número entero en C?
- 29. cómo convertir un entero a una cadena en gnuplot?
- 30. Ruby - Conversión de entero a cadena
por cierto, 1.2 no es un entero . – Zaki
Appart analizándolo en un flotador y luego enrutado, no veo cómo podrías hacer eso ... – Philippe
'(int) float.Parse (" 1.2 ")' - no es demasiado trabajo. Sin embargo, Ruby hace esto: '" 1.234 ".to_i' produce 1 – Gishu