Programmering C#, hur göra så användaren kan skriva 17.00 istället för 1700?

Permalänk
Medlem

Programmering C#, hur göra så användaren kan skriva 17.00 istället för 1700?

Vet ej om detta är rätt forum för att fråga men är rätt beginner på programmering och går just nu Programmering 1a som extra kurs
Undrar om jag kan få in så användaren kan skriva tex: 17.00 istället för 1700 och sedan skriva ut det i en string.
Min kod ser ut såhär just nu:

static void SecondChoise2() { Console.Clear(); Console.WriteLine("Skriv in vilken tid du vill aktivera larmet"); string StringActivate = Console.ReadLine(); int TimeActivate = Convert.ToInt32(StringActivate); Console.WriteLine("Larmet kommer att aktiveras" + " " + TimeActivate); Console.ReadLine(); }

Programmet går att köra och den skriver ut heltal men hur går jag tillväga om jag vill att programmet ska srkiva ut 17 " . " 00 exempelvis med punkten?
Eller har ni något bättre förslag?
Och hur gör jag en try catch till detta så användaren inte kan skriva fel?
Sitter fast lite här och undrar om jag bara ska göra slutuppgiften lite lättare ....
TAcksam för svar

Permalänk
Hedersmedlem

@Kevinpe *Rubrik förtydligad samt lagt till [code]-taggar*

Kom ihåg att en tydlig icke caps lock-rubrik ger bättre svar och ett mer lättnavigerat forum. Använd även gärna [CODE][/CODE]-taggar när du postar kod i forumet.

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Medlem

Ser ut som att du vill att användaren ska ange ett klockslag. Nu har jag aldrig kört c# själv men det jag skulle titta på är om du kan parse:a ett klockslag på olika sätt. Skulle tippa på att det finns ett standardbibliotek i c# för sånt. Och sen utgå ifrån det

Permalänk
Avstängd

Jag hade använt substring på de två första tecknen. Konvertera till int med try catch. Validera att talet är mellan 0 och 23. Samma med de två sista tecknen. Mittentecknet hade jag validerat mot punkt eller kolon.

Permalänk
Medlem

Jag förstår inte syftet med att konvertera det användaren skriver in eftersom det enbart används för en print.
Det är bara att skippa ToInt32 så kan du ju skriva in vad fasiken du vill, men du förlorar väl då någon typ av fattigmans-validering som iaf förväntar sig att användaren ska skriva in ett heltal. (Men det hindrar ju ingen från att skriva in t ex 42)

En enkel lösning (i stil med programmering 1a) är väl att be om både timme och minut i två olika inputs eftersom du vill ha ut t ex 17.00.

Edit: Annars om du bara vill ha outputen kan du göra såhär, men då är vi i gränslandet till om det är något du har listat ut själv
Fördelen är att du nu även får en validering på att det blir en giltig timme eftersom DateTime-parsen inte kommer fungera om du anger något större än 24.

Console.WriteLine("Skriv in vilken tid du vill aktivera larmet"); string StringActivate = Console.ReadLine(); var TimeActivate = DateTime.ParseExact(StringActivate, "HH", null); Console.WriteLine("Larmet kommer att aktiveras" + " " + TimeActivate.ToString("HH.mm")); Console.ReadLine();

Permalänk
Medlem

static void SecondChoise2() { Console.Clear(); Console.WriteLine("Skriv in vilken timme du vill aktivera larmet tex: 11, 15 eller 18"); string StringHour = Console.ReadLine(); int HourActivate = Convert.ToInt32(StringHour); Console.Clear(); Console.WriteLine("Skriv in vilken minut du vill aktivera larmet tex: 5, 19, 30"); string StringMinute = Console.ReadLine(); int MinuteActivate = Convert.ToInt32(StringMinute); Console.Clear(); Console.WriteLine("Larmet kommer att aktiveras" + " " + HourActivate + "." + MinuteActivate); Console.ReadLine(); }

Gjorde såhär själv det fungerar ju så nu måste jag bara har någon typ av grej som fångar ifall man skriver typ "25" på timme eller "61" på minut.

Permalänk
Medlem
Visa signatur

MSI PRO Z790-P WIFI | Intel i9 13900K | 128 GB DDR5
NVIDIA GeForce GTX 4070 12 GB
WD Black SN850X 2 TB Gen 4 | 2 x 1 TB Samsung 970 EVO Plus
3 x ASUS 27" | 1 x Philips 49"

Permalänk
Medlem

Du kan formatera strings hur du vill genom att använda string interpolation $""

https://docs.microsoft.com/en-us/dotnet/csharp/language-refer...

Dokumentation beskriver exakt hur du går tillväga för att utföra det du vill, lycka till.

Jag råder dig att undvika dela upp timmar och minuter, spara som en standardiserad tid och formatera därefter enligt önskemål.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem

beroende på vad du vill göra kan du använda split.

Console.Clear(); Console.WriteLine("Skriv in vilken tid du vill aktivera larmet"); string? StringActivate = Console.ReadLine(); if (!String.IsNullOrEmpty(StringActivate) && StringActivate.Split(":").Length==2) { int ActivateHour = Convert.ToInt32(StringActivate.Split(":")[0]); int ActivateMinute = Convert.ToInt32(StringActivate.Split(":")[1]); Console.WriteLine("Larmet kommer att aktiveras" + " " + ActivateHour.ToString() + ":" + ActivateMinute.ToString("0#")); Console.ReadLine(); }

Permalänk
Medlem

Tack för alla tips har läst allt och försökt förstå!
Slutade med en enklare variant och kanske inte lika praktisk men det känns som den är mer på min nivå för tillfället!
Delar den här ifall någon annan noob googlar sig fram ett liknande problem ^^

static void SecondChoise2() { Console.Clear(); int HourActivate = 0; int MinuteActivate = 0; while (true) { try { Console.WriteLine("Skriv in antalet timmar tills larmet ska aktiveras!"); HourActivate = (Convert.ToInt32(Console.ReadLine())); Console.Clear(); Console.WriteLine("Skriv in antalet minuter tills larmet ska aktiveras!"); MinuteActivate = (Convert.ToInt32(Console.ReadLine())); Console.Clear(); Console.WriteLine("Larmet kommer aktiveras om" + " " + HourActivate + " " + "timmar och" + " " + MinuteActivate + " " + "minuter!\n\nTryck Enter för att avsluta programmet!"); Console.ReadLine(); Console.WriteLine("Programmet avslutas!"); Environment.Exit(1); } catch { Console.Clear(); Console.WriteLine("Nu blev det fel!\nDu måste skriva in ett heltal!\n\nTryck Enter för att försöka igen"); Console.ReadLine(); break; } } }

Permalänk
Medlem

@Kevinpe

Aldrig skrivit C# själv men såg ett antal problem i din logik du skulle behöva se över. Din catch fångar inte saker som värden utanför 0-23 och 0-59. Efter ditt felmeddelande i din catch kör du en readline men det sparar du aldrig i någon variabel. Tänker att jag låter dig klura lite på hur du vill lösa detta själv

Permalänk
Medlem

@Kevinpe: En sak du kan göra är att flytta ut en del av koden ut ur while-loopen. Just nu har du:

while (true) { try { Läs in timmar Läs in minuter Skriv ut meddelande om när larmet aktiveras Avsluta programmet } catch { Skriv ut felmeddelande Avsluta loopen? (<- troligtvis fel i din kod) } }

En bättre struktur vore:

while (true) { try { Läs in timmar Läs in minuter Avsluta loopen (eventuellt kolla att de inmatade värdena faktiskt är korrekta först) } catch { Skriv ut felmeddelande } } Skriv ut meddelande om när larmet aktiveras Avsluta programmet

D.v.s. placera endast kod som du faktiskt vill upprepa inne i loopen. Koden blir enklare att följa och resonera om ifall den är uppdelad i flera delar, istället för att du har en stor while-loop med allting i.

Choise är förresten fel, det stavas Choice. Inte för att det påverkar hur koden fungerar, men ändå

Skrivet av cjal:

Efter ditt felmeddelande i din catch kör du en readline men det sparar du aldrig i någon variabel.

Detta är troligtvis avsiktligt för att "pausa" programmet tills användaren trycker på Enter. Det är inte meningen att användaren ska mata in något där så ingen mening med att spara det.

Permalänk
Medlem

string indata = Console.ReadLine(); TimeOnly to = new TimeOnly(); if (indata.Length == 4) // Inget skiljetecken indata = indata.Insert(2, ":"); if (indata.Length == 5) // skiljetecken finns, se till att det är : indata = indata.Remove(2,1).Insert(2,":"); to = TimeOnly.Parse(indata);

Lite HackeHackspett, men tillåter inmatning med valfritt mellantecken, samt automatisk validering på att det är ett godkänt klockslag

mvh Lazze

Permalänk
Inaktiv

Du vill absolut använda en av dom inbyggda typerna för tid här (datetime, timeonly osv).

Allt dravel om att själv parsea strängen är usla råd om du vill göra det fackmannamässigt.

If(TimeOnly.TryParse(inputString, out TimeOnly time)) { // Inputstring är en giltig tid, du kan använda time för att hämta ut timmar, minuter, sekunder osv. } else { // Inputstring är inte en giltig tid, ignorera det helt, meddela användaren, gör annat här? }