web-dev-qa-db-fra.com

C # Conversion décimale en chaîne avec le format spécifié

J'ai besoin de convertir un nombre décimal a en chaîne b comme suit:

  • b doit avoir le caractère '.'. Par exemple:
    • a = 12 -> b = "12.0"
    • a = 1.2 -> b = "1.2"
    • a = 1.234 -> b = "1.234"

Comment puis-je faire cela avec 1 commande?

  • b doit avoir exactement 10 caractères. Par exemple:
    • a = 101 -> b = "101.000000"
    • a = 1.234 -> b = "1.23400000"
    • a = 1,234567891 -> b = "1,23456789"

(Même question avec 1)

6
tamhoang
decimal a = 12;
var b = a.ToString("N1"); // 12.0

a = 1.2m;
b = a.ToString(); // 1.2

a = 101m;
b = a.ToString("N10"); // 101.0000000000

a = 1.234m;
b = a.ToString("N10"); // 1.2340000000

Pour la deuxième partie de votre question - où vous voulez une longueur totale de 10 alors:

decimal a = 1.234567891m;
int numberOfDigits = ((int)a).ToString().Length;
var b = a.ToString($"N{9 - numberOfDigits}"); //1.23456789

//Or before C# 6.0
var b = a.ToString("N" + (9 - numberOfDigits)); //1.23456789

En gros, ((int)number).ToString().Length vous donne le nombre de chiffres avant le . (la conversion en int enlèvera les fractions), puis en la réduisant du nombre de chiffres après le . (ainsi que -1 pour le point décimal lui-même).

5
Gilad Green

Vous pouvez utiliser .ToString() pour effectuer cette tâche:

decimal aDecimalVal = 10.234m;
string decimalString = aDecimalVal.ToString("#.000"); // "10.234"
aDecimalVal.ToString("#.00"); // "10.23"
aDecimalVal.ToString("#.0000"); // "10.2340"

Le nombre de 0 après le . dans la chaîne de formatage déterminera le nombre de places dans la chaîne décimale.

Mises à jour: Donc, vous voulez trouver le nombre de chiffres après la virgule décimale, les modifications dans le code seront donc comme suit:

decimal aDecimalVal = 10.2343455m;
int count = BitConverter.GetBytes(decimal.GetBits(aDecimalVal)[3])[2];
string formatString = String.Format("N{0}",count.ToString());
string decimalString = aDecimalVal.ToString(formatString); // "10.2343455"
2
sujith karivelil

Je parviens à le faire en utilisant double. Est-ce ce dont vous avez besoin? Je ne comprends pas tout à fait la deuxième partie de votre question.

    double a = 12;
    string b = a.ToString("0.0000000000######");
    Console.WriteLine(b);
1
active92

Pour le premier, si vous ne connaissez pas le nombre de chiffres de la variable, vous pouvez utiliser une méthode d'extension:

public static string ToSpecificFormat(this decimal value)
{
    var count = BitConverter.GetBytes(decimal.GetBits(value)[3])[2];
    return value.ToString(count == 0 ? "N1" : "N" + count);
}

Cela garantira qu'il y a au moins 1 chiffre dans la sortie.

Pour le second, la réponse sélectionnée échouera si le nombre> 1000000000. Celui-ci devrait fonctionner:

public static string ToFixedLength(this decimal value)
{
    if (value >= 1000000000m) return value.ToString("N0");

    var format = 9 - Math.Floor(value).ToString().Length;
    return value.ToString("N" + format);
}

sortie:

1.234m.ToFixedLength(); // 1.23400000
101m.ToFixedLength(); // 101.000000
123456789123m.ToFixedLength(); // 123,456,789,123
0
Stephen Zeng

si vous voulez que le résultat soit une chaîne, il suffit de l’analyser et de le formater avec une décimale:

string strTemp = 12;
double temp = Double.Parse(strTemp, CultureInfo.InvariantCulture);
string result = temp.ToString("N1", CultureInfo.InvariantCulture);

Arrondir à 2 décimales, par exemple. 27,658 => 27,66

Assurez-vous qu'il y a toujours 2 décimales, par exemple. 12 => 12,00, 12,5 => 12,50

Bon ajustement pour les montants en devises.

strTemp.ToString("F");
0
Developer