Textbox   otázka

VB.NET, WinForms

Dobrý den , mám takové tři otázky s kterými mam problám

- Jak udělat aby nějakej nadeklarovanej prvek sečetl všechny čísla v textboxu ?

Vim že bych to mohl udělat u každého zvlášt ale třeba u 50 čísel by mi to trvalo pul roku

- Je nějaká funkce pro zjištění kolik je znaků v textboxu ( ne aby je sečetla , protože chci dělat průměr :D )

- A eště jeden dotaz - Jde nějak udělat aby ten prvek na sčítání vynechýval mezery , nebo něco co by je disablovalo hned v textboxu ?

Díky a ahoj

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Budu předpokládat, že čísla v TextBoxu jsou celočíselná a oddělená mezerami. Pak pomocí funkce

Dim TmpStrings() as string
TmpStrings() = Strings.Split(textbox1.text, " ", , CompareMethod.Text)

rozdělíš čísla do jednotlivých položek pole s vynecháním mezer a překonvertuješ do pole čísel

Dim TmpInt() as integer
Redim TmpInt(TmpStrings.Length-1)
for i as integer = 0 to TmpStrings.Length-1
TmpInt(i) = cint(TmpStrings(i)
Next

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Z Vašeho dotazu neplyne moc jasně, jestli chcete spočítat průměr čísel, nebo číslic. Neuvedl jste, jestli jsou data oddělená nějakým separátorem. Ale obě řešení jsou si relativně podobná:

' Průměr číslic:
Dim prumer = "123456789".
  Where(Function(c) Char.IsNumber(c)).
  Select(Function(n) Integer.Parse(n)).
  Average()
' Průměr čísel:
Dim prumer = "1,2,3,4,5,6,7,8,9".
  Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries).
  Select(Function(n) Integer.Parse(n)).
  Average()

Pokud chcete omezit vstup v TextBoxu pouze na čísla, můžete použít MaskedTextBox a nastavit vlastnost Mask (pro čísla pevné délky) a nebo NumericUpDown, což je přesně to, co hledáte, pokud chcete pouze číselný vstup.

Délka textu v TextBoxu se zjistí pomocí TextBox#.Text.Length.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám prosbu, zda byste mohl uvedený kód vysvětlit? Co znamenají a dělají tečky?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Celý ten postup je založený na technologii zvané Language Integrated Query, tedy LINQ. Tečky jsou normální oddělovače jako všude, ale zalomil jsem řádky, protože je tady ten blok kódu úzký, tak aby to bylo přehlednější. Lze to samozřejmě zapsat i jako:

Dim prumer = "123456789".Where(Function(c) Char.IsNumber(c)).Select(Function(n) Integer.Parse(n)).Average()

A teď zpátky k LINQ. Funkce Select, Average, Where a podobně jsou definované na typu Enumerable (respektive rozhraní IEnumerable). Textový řetězec String také implementuje IEnumerable, protože je to vlastně množina znaků. LINQ funkce jsou funkce pro transformaci a filtrování takové množiny.

"123456789".Where(Function(c) Char.IsNumber(c)) znamená: vezmi všechny prvky v množině 123456789 (množina Charů) a prožeň je (lambda) funkcí Function(c) Char.IsNumber(c). IsNumber vrací True pro 0-9 a False pro vše ostatní. Pokud funkce pro daný Char vrátí True, bude součástí výstupní množiny fce. Pokud tedy budu mít "a1b2c3d4---#9" a proženu to touto konstrukcí, dostanu množinu znaků [1,2,3,4,9].

Select(Function(n) Integer.Parse(n)) znamená projekci vstupního typu na výstupní pomocí opět lambda funkce Function(n) Integer.Parse(n). Integer.Parse udělá z typu Char typ Integer. My máme jistotu, že nemůže nastat problém, protože dostaneme na 100 % pouze znaky 0-9, které jsme si vyfiltrovali, pokud by ale tato jistota nebyla, používá se TryParse, což vrací Boolean a buď dosadí nebo nedosadí do předaného referenčního parametru. Výstupem této konstukce je množina Integerů [1,2,3,4,9].

Average() pak už je jen pomocná funkce, která umí vzít numerické datové typy (voláme jí na té možině integerů) a udělat z nich aritmetický průměr.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky moc za perfektní výklad! Funkce jsou šikovné, nevěděl jsem o nich (ale není divu, VB nijak nestuduji - čerpám z webu jen to, co zrovna potřebuji a vše dělám jako pokus / omyl).

Kód jsem zkusil a překvapuje mě, že funguje jak je, se zalomenými řádky bez potřeby _ (podržítka) před zalomením.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

O LINQ je škoda nevědět, je to skvělá technologie a usnadní spoustu času. Na Internetu je spousta příkladů, určitě si o tom něco přečtěte, když budete mít chvíli času, jistě to v budoucnu oceníte. A podtržítko (respektive mezera, podtržítko a line-break) je dobrá poznámka, nevím přesně kdy, ale není to tak dlouho, co se od něj částečně upustilo na některých místech a už není vyžadováno. Například za atributy už jej dnes také uvádět nemusíte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback