Formattazione di una stringa convertendola in un numero e poi di nuovo in una stringa

0

Non sono sicuro se questo si qualifica come odore di codice, o se potrebbe esserci un modo migliore per eseguire lo stesso compito, ma, in pratica, voglio formattare una stringa di 10 cifre, usando C #, e avere le seguenti opzioni ...

Opzione 1

public string FormatNumber(string value)
{
    int i;
    if(int.TryParse(value, out i)) return i.ToString("000 000 0000");
    else throw new InvalidArgumentException("'" + value + "' is not a valid argument.");
}

Opzione 2

public string FormatNumber(string value)
{
    int i;
    if(int.TryParse(value, out i)) return value.Insert(6," ").Insert(3," ");
    else throw new InvalidArgumentException("'" + value + "' is not a valid argument.");
}

Entrambi ottengono il risultato corretto, ma entrambi si sentono un po '... puzzolenti.

Sono troppo pedante, o è un chiaro vincitore?

    
posta Paul 21.08.2018 - 18:55
fonte

3 risposte

8

Personalmente penso che il primo sia più leggibile. Rende molto chiaro qual è l'output atteso. Il secondo potrebbe richiedere uno sforzo maggiore.

A proposito, cosa succede se il numero non si adatta alle 10 cifre? E se il numero fosse negativo?

    
risposta data 21.08.2018 - 19:09
fonte
1

Tra le due opzioni, l'opzione 1 è migliore perché mostra il formato desiderato ( cosa ), invece delle operazioni necessarie per ottenerlo ( come ).

Esistono naturalmente altri modi per verificare se una stringa è composta da tutte le cifre che non implicano la conversione del tipo; ma a meno che non siano più chiari, non vedo problemi a farlo in questo modo.

    
risposta data 21.08.2018 - 19:14
fonte
0

Un trucco che potresti non aver pensato è di dare al numero speciale una sua classe, con conversione implicita, che lo rende più facile da usare.

La classe speciale fornisce un naturale punto di estensione se in futuro dovrai aggiungere operazioni di confronto, codice hash personalizzato, serializzazione personalizzata, ecc.

Nota anche: un int non può contenere tutti i numeri di dieci cifre, avresti bisogno di un long . Inoltre, dovresti convalidare contro i numeri negativi.

public class MyNumber
{
    protected readonly long _value;

    public MyNumber(string source)
    {
        if (!long.TryParse(source, out _value)) throw new ArgumentException("String cannot be converted to a MyNumber");
        if (_value <=0) throw new ArgumentException("MyNumber must be at least 1.");
        if (_value > 9999999999) throw new ArgumentException("MyNumber must be ten digits or fewer.");
    }

    static public implicit operator long(MyNumber source)
    {
        return source.Value;
    }

    static public implicit operator MyNumber(string source)
    {
        return new MyNumber(source);
    }

    public long Value { get { return _value; } }

    public override string ToString()
    {
        return _value.ToString("000 000 0000");
    }
}

Alcuni modi per usarlo:

MyNumber n = "12345678";
Console.WriteLine("Your magic number is {0}", n);

Console.WriteLine("Another number is {0}", (MyNumber)"9876543");

Output:

Your magic number is 001 234 5678
Another number is 000 987 6543

Collegamento a DotNetFiddle

    
risposta data 21.08.2018 - 20:28
fonte

Leggi altre domande sui tag