Ilosc miejsc po przeciunku

0

Witam

czy istnieje funkcja ktora zwraca ile dana liczba ma miejsc po przecinku ??

np 1.0146 wynosi 4

dziekuje i pozdrawiam

[i][i][i][i]

0

zamień na string, obetnij to co jest przed kropką (i kropkę też), policz znaki

0

Szczerze powiem, że nie wiem czy funkcja taka istnieje, jeśli nie to nie jest szczególnym kłopotem jej napisanie :

Potrzebne Ci będzie :
funkcje są static gdyż były stosowane do użycia w konsoli.

        static int LiczbaPoPrzecinku(object arg)
        {
            try
            {
                string liczba = arg.ToString(); 
                // konwertujemy jakąś zmienna do zmiennej tekstowej
                int miejsce_przecinka = liczba.IndexOf(',');
                // liczbe podajemy z "." np. <b>4.342f</b> ale przy konwersji do stringa "." jest zamieniane na ","
                miejsce_przecinka++; 
                // dodajemy +1, gdyż indexOf zwraca miejsce przecinka, a my potrzebujemy miejsce za     przecinkiem
                liczba = liczba.Substring(miejsce_przecinka, liczba.Length - miejsce_przecinka);
                // w tym miejscu wycinamy tekst od znkau , do konca tekstu w tym przykladzie co podałem wyzej bedzie to : 342
                return liczba.Length;
                // zwracamy dlugosc tego "wyciecia"
            }
            catch
            {
                return -1;
               // jesli nie dało się okreslic dlugosci zwracamy -1 gdyż taka długość jest niemożliwa
            }

        }

teraz kod programu

        static void Main(string[] args)
        {
            float liczba1 = 432.4324f;
            double liczba2 = 43.32122133d;

            int w_liczba1 = LiczbaPoPrzecinku(liczba1);
            int w_liczba2 = LiczbaPoPrzecinku(liczba2);

            if (w_liczba1 != -1) Console.WriteLine(w_liczba1);
            if (w_liczba2 != -1) Console.WriteLine(w_liczba2);

            Console.Read();
        }
0

static int LiczbaPoPrzecinku(object arg)
{
try
{
string liczba = arg.ToString();
// konwertujemy jakąś zmienna do zmiennej tekstowej
int miejsce_przecinka = liczba.IndexOf(',');
// liczbe podajemy z "." np. 4.342f ale przy konwersji do stringa "." jest zamieniane na ","
miejsce_przecinka++;
// dodajemy +1, gdyż indexOf zwraca miejsce przecinka, a my potrzebujemy miejsce za przecinkiem
liczba = liczba.Substring(miejsce_przecinka, liczba.Length - miejsce_przecinka);
// w tym miejscu wycinamy tekst od znkau , do konca tekstu w tym przykladzie co podałem wyzej bedzie to : 342
return liczba.Length;
// zwracamy dlugosc tego "wyciecia"
}
catch
{
return -1;
// jesli nie dało się okreslic dlugosci zwracamy -1 gdyż taka długość jest niemożliwa
}

    }

Słaby sposób - nie będzie działać dla ustawień Amerykańskich.

Poczytaj o CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;

0

Gdyby napisać funkcję porządnie, tzn. nie dawać jako argument typu object (WTF?!), to można by użyć przeciążonej wersji ToString i podać jej CultureInfo.InvariantCulture, aby zawsze po konwersji do stringa znajdowała się w nim kropka.

0

Czy na pewno się tak da?
Jeżeli we float ustawisz sobie np. 1,51923f to po zmianie na string możesz uzyskać postać
1,51923000023 także nie wiem czy uzyskasz to czego chcesz.

0

jesli uzyjesz CultureInfo.InvariantCulture to uzyskasz poprawna wartosc,
przyklad:

majac taka metode:

    public static int CountNum(string arg)
    {
       
        int num = arg.IndexOf('.') + 1;
        arg = arg.Substring(num, arg.Length - num);
        return arg.Length;
    }

i wywolujac ja z takim parametrem:

float test = 2.2262f;
Console.WriteLine(CountNum(test.ToString(System.Globalization.CultureInfo.InvariantCulture)));

uzyska sie wynik pozadany czyli 4.

0

Super dziekuje wszystkim za odpowiedz :)

Pozdrawiam

0
HideYoshi napisał(a)
int num = arg.IndexOf('.') + 1;

A co gdy separatorem będzie przecinek?
A co gdy separatorem będzie abc (separator dziesiętny w Windows może mieć max 3 znaki, kto nie wierzy niech sprawdzi)?

1

@up - Nie przeczytałeś całego wątku...

CountNum(test.ToString(System.Globalization.CultureInfo.InvariantCulture))

To chyba powinno załatwić sprawę separatora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1