Diskuze: Převod řetězce na typ Single
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Za předpokladu že v tom stringu je opravdu číslo které lze přetypovat na Single, tak by ti ta verze s CType měla fungovat. Následující kód mi funguje bez problémů a jediný rozdíl oproti tvé verzi je ten, že jsem deklaroval t1. Pokud máš Visual Studio nastaveno aby ti samo určovalo datový typ podle hodnoty proměnné, tak důrazně doporučuju to vypnout.
Dim T As String = "123"
Dim t1 As Single = CType(T, Single)
Console.WriteLine("Hodnota je: {0}", t1)
Nicméně zásadní problém je v tom, že pokud se přetypování nepovede,
aplikace spadne.
Jistější je použít TryParse, kde v návratové hodnotě této funkce je
informace, zda se přetypování povedlo (true) nebo nepovedlo (false). Navíc
pokud se přetypování nepovede, tak aplikace nespadne, ale jen se neuloží do
proměnné t1 nová hodnota (v tomto případě tam zůstane defaultní hodnota,
což je u Single 0):
Dim T As String = "123"
Dim t1 As Single
If Single.TryParse(T, t1) = True Then
' přetypování se povedlo
Console.WriteLine("Přetypování OK, hodnota je: {0}", t1)
Else
' přetypování se nepovedlo
Console.WriteLine("Přetypování se nepovedlo")
End If
Načítám tento soubor z disku:
10 0
594.644
454.6439 2
154.6439
14.64392 4
-385.3561
-394.6894 4.133333
-394.6894
-404.0227 4.266667
-404.0227
-413.356 4.4
-413.356
-422.6894 4.533333
-422.6894
-424.0893 4.553333
-424.0893
-425.4893 4.573333
-425.4893
-426.8893 4.593333
-426.8893
-428.2893 4.613333
-428.2893
-525.3561
323.9388
203.9388 2
3.938782
-176.0612 5
-476.0612
-477.2613 5.02
-477.2613
-478.4613 5.04
-478.4613
-479.6613 5.06
-479.6613
-480.8613 5.08
-480.8613
-482.0613 5.1
-482.0613
-483.2613 5.12
-483.2613
-484.4613 5.14
-484.4613
-485.6613 5.16
-485.6613
-536.0613
606.7308
366.7308 3
-33.26923
-193.2692 5
-493.2693
-494.8693 5.02
-494.8693
-496.4693 5.04
-496.4693
-498.0693 5.06
-498.0693
-499.6693 5.08
-499.6693
-501.2693 5.1
-501.2693
-502.8693 5.12
-502.8693
-504.4693 5.14
-504.4693
-506.0693 5.16
-506.0693
-573.2693
první 2 čísla přečtu lehce, ale real číslo dělá problém, jak ho tedy přečíst.
Nejjednodušší způsob mi přijde: 1. převést do stringu ; 2. Pomocí funkce string.Replace(), vyměnit '.' za ',' ; 3. Convert.ToSingle(tvojePromena):
String neco = "12.5 ";
neco = neco.Replace(".",",");
float cislo = float.Parse(neco);
Single singl = 0;
singl = Convert.ToSingle(cislo);
To bych silně nedoporučoval. Pokud to pustíš na počítači kde bude nastaveno jiné jazykové prostředí s jiným oddělovačem desetinných míst, zas to nebude fungovat. Navíc jsem to zkoušel a problém není v oddělovači (to jde nastavit pomocí InvariantCulture) ale z nějakého mně neznámého důvodu má problém se zápornýma číslama. Kladná to přetypuje bez problémů. Navíc ten kdo má na svědomí ten datový soubor by zasloužil za uší, jako oddělovač sloupců použít sekvenci 6 až 12 mezer je něco
Je to snadne. Mezery nahrad znakem pak splitni a hotovo. Zmenou Culture reknes, aby bral jako oddelovat v cisle tecku. Dale pomoci regularniho vyrazu zamenis mezery za jeden oddelovac napr. '|'. Napr.:
static void Main(string[] args) {
CultureInfo customCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = customCulture;
StreamReader strReader = new StreamReader("TextFile1.txt");
string line = String.Empty;
string regPattern = @"\s+";
Regex regReplace = new Regex(regPattern);
while ( (line = strReader.ReadLine())!=null ) {
string lineWithoutSpaces = regReplace.Replace(line.Trim(), "|");
string[] values = lineWithoutSpaces.Split('|');
Single val1, val2;
if (values.Length == 1) {
Single.TryParse(values[0].Trim(), out val1);
Console.WriteLine("{0}", val1);
}
else {
Single.TryParse(values[0].Trim(), out val1);
Single.TryParse(values[1].Trim(), out val2);
Console.WriteLine("{0}\t{1}", val1, val2);
}
}
#if DEBUG
Console.ReadKey();
#endif
}
Je to priklad - nejsou osetreny vyjimky atp. Takze pokud copy&paste tak dodelat
Ahoj Honzo,
podařilo se Ti přečíst ten soubor dat?
Když ano, tak mi napiš jak.
D í k y !
To je snad v Céčku, já programuji ve Visual Basic.
Není problém si to do Visual Basicu přepsat, použité třídy, metody,
vlastnosti, ... jsou stejné.
Kdyžtak tady: http://converter.telerik.com
Presne jak pise kolega - neni problem to prepsat. Chtelo by pridat vic vlastni iniciativy! Ve VB .Net nedelam, ale abych dokazal jak jsou si kody podobne a tzn. snadno prepsatelne :
Sub Main()
Dim line As String = String.Empty
Dim regReplace = New Regex("\s+")
SetCulture()
Using strR As New StreamReader("TextFile.txt")
line = strR.ReadLine
While line IsNot Nothing
Dim lineWithoutSpaces As String, values() As String
Dim val1, val2 As Single
lineWithoutSpaces = regReplace.Replace(line.Trim, "|")
values = lineWithoutSpaces.Split(New Char() {"|"})
If values.Length = 1 Then
Single.TryParse(values(0).Trim, val1)
Console.WriteLine("{0}", val1)
Else
Single.TryParse(values(0).Trim, val1)
Single.TryParse(values(1).Trim, val2)
Console.WriteLine("{0} {1}", val1, val2)
End If
line = strR.ReadLine
End While
End Using
#If DEBUG Then
Console.ReadKey()
#End If
End Sub
Sub SetCulture()
Dim customCulture = Thread.CurrentThread.CurrentCulture.Clone
customCulture.NumberFormat.NumberDecimalSeparator = "."
Thread.CurrentThread.CurrentCulture = customCulture
End Sub
Jeste bych dodal - Lidi zkuste aspon obcas neco vyresit, nez jen cekat kdo vam reseni postne
Bohužel zasekl jsem se na na těch záporných číslem. Rozpsarsovat to a získat jednotlivé hodnoty není problém, ale nějak to nechce převést čísla se znaménkem mínus a zatím jsem nepřišel proč.
Velice děkuji Romane,
ten kód dobře pracuje, ten soubor to správně čte.
Jako začátečník bych to nedokázal napsat, tak ještě jednou d í k y.
Zobrazeno 12 zpráv z 12.