Panowie mam problem ponieważ mam tablicę jedno wymiarową string gdzie są same wartości numeryczne (również wartości przecinkowe) a muszę z tego wyznaczyć minimalną wartość... I tu jest problem bo nie mogę tego przekonwertować.. Próbowałem tak :
static double fMin(string[] tab) { double[] tab2 = new double[tab.Length]; for (int i = 0; i < tab.Length; i++) { tab2[i] = Convert.ToDouble(tab[i]); }
double min = /tab.First()
for (int i = 1; i < tab.Length; i++) { if (tab2[i] < min) min = tab2[i]; }
return min; }
Lecz niestety wyrzuca mi błąd, że "nieprawidłowy format ciągu wejściowego"... Ktoś mi coś poradzi ;) ?
@Phoryn: Bo przecinek w jednym kraju służy do oddzielenia tysięcy a winnym części ułamkowej. Gdzie indziej używa się kropki zamiast przecinka. Masz IFormatProvider w wersji przeciążonej Convert.ToDouble
@Kamasetto: Ale namieszałeś... ( ͡°͜ʖ͡°) I pewnie nic z tego nie zadziała poprawnie.
Przejrzałbym plik i zrobił to wykorzystując odpowiednią kulturę albo dostosowując ją var cultureInfo = CultureInfo.InvariantCulture.Clone() as CultureInfo; cultureInfo.NumberFormat.NumberDecimalSeparator = ","; // tu okreslamy separator dla ułamków cultureInfo.NumberFormat.NumberGroupSeparator = "."; // tu określamy separator dla tysięcy akurat kropa ale może to być dowolny string for (int i = 0; i < tab.Length; i++)
Akurat sprawdziłem i wszędzie są kropki... nie ma przecinków, więc to nei może być problem tego... Może po prostu napisałbym nową metodę, która przepisze mi tablicę jednowymiarową stringów na tablicę jednowymiarową intów...
@Phoryn: To wystarczy, że zrobisz tak Convert.ToDouble(i, new CultureInfo("en-us")); i powinno działać chyba, że masz spacje między tysiącami:) using System.Globalization; -to też musisz dodać. Amerykanie używają kropki do części ułamkowej a my przecinka stąd masz błąd formatu bo wzięło z do konwersji ustawienia domyślne komputera
Właśnie się rozstałem po 5 latach związku. Czuję się #!$%@?, ale myślę, że tak będzie lepiej. Kiedyś zbiorę siły i może napiszę coś więcej na ten temat. #zwiazki
Panowie mam problem ponieważ mam tablicę jedno wymiarową string gdzie są same wartości numeryczne (również wartości przecinkowe) a muszę z tego wyznaczyć minimalną wartość... I tu jest problem bo nie mogę tego przekonwertować.. Próbowałem tak :
static double fMin(string[] tab)
{
double[] tab2 = new double[tab.Length];
for (int i = 0; i < tab.Length; i++) {
tab2[i] = Convert.ToDouble(tab[i]);
}
double min = /tab.First()
for (int i = 1; i < tab.Length; i++)
{
if (tab2[i] < min)
min = tab2[i];
}
return min;
}
Lecz niestety wyrzuca mi błąd, że "nieprawidłowy format ciągu wejściowego"... Ktoś mi coś poradzi ;) ?
Bo przecinek w jednym kraju służy do oddzielenia tysięcy a winnym części ułamkowej. Gdzie indziej używa się kropki zamiast przecinka.
Masz IFormatProvider w wersji przeciążonej Convert.ToDouble
using System.Globalization;
Convert.ToDouble(tab[i], new CultureInfo("pl-pl"));
Convert.ToDouble(tab[i], new CultureInfo("en-us"));
itp...
gejowskie (bo po stringu), ale najszybsze:
mądrzejsze:
da się to pewnie jeszcze prościej zapisać, jakoś tak:
w pętli np. tab2[i].Replace(',','.'); //cuś takiego może odwrotnie, przecinek z kropką
@Phoryn:
Przejrzałbym plik i zrobił to wykorzystując odpowiednią kulturę albo dostosowując ją
var cultureInfo = CultureInfo.InvariantCulture.Clone() as CultureInfo;
cultureInfo.NumberFormat.NumberDecimalSeparator = ","; // tu okreslamy separator dla ułamków
cultureInfo.NumberFormat.NumberGroupSeparator = "."; // tu określamy separator dla tysięcy akurat kropa ale może to być dowolny string
for (int i = 0; i < tab.Length; i++)
Jedna linijka wystarczy.
new string[] { "1.22", "1.23", "7.68", "9.45","1,122.1" }
i już nie zadziała( ͡° ͜ʖ ͡°)
przecież chodzi o błąd formatu
Akurat sprawdziłem i wszędzie są kropki... nie ma przecinków, więc to nei może być problem tego...
Może po prostu napisałbym nową metodę, która przepisze mi tablicę jednowymiarową stringów na tablicę jednowymiarową intów...
i powinno działać chyba, że masz spacje między tysiącami:)
using System.Globalization; -to też musisz dodać.
Amerykanie używają kropki do części ułamkowej a my przecinka stąd masz błąd formatu bo wzięło z do konwersji ustawienia domyślne komputera
static double[] StringDoTablicy(string[] tab) {
string a;
double[] tablica = new double[tab.Length];
for (int i = 0; i< tab.Length; i++)
{
a = tab[i];
tablica[i] = StringToDouble(a);
}
return tablica;
}
Szkoda, że się tak długo męczyłem nad taką głupotą