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]
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]
zamień na string, obetnij to co jest przed kropką (i kropkę też), policz znaki
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();
}
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;
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.
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.
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.
Super dziekuje wszystkim za odpowiedz :)
Pozdrawiam
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)?
@up - Nie przeczytałeś całego wątku...
CountNum(test.ToString(System.Globalization.CultureInfo.InvariantCulture))
To chyba powinno załatwić sprawę separatora.