Diskuze: Nuly na začiatku
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Predpokladam ze ta cisla o kterych se zminujes jsou dat. typu integer. Tedy muze obsahovat jen celociselne hodnoty. Cislo 015 je samozrejme blbost, protoze je to cislo 15. Pokud chces cislo 15 zobrazit jako 015, musis ho zobrazovat jako string s tim ze si zleva doplnis 0 na tebou pozadovany pocet radu ...
Ahoj,
jestli chceš pracovat obecně spíše s řetězci, tak já bych vytvořil novou
třídu, třeba CisloVyrobku, která by obsahovala atribut typu String, asi
takto:
class CisloVyrobku {
private String vyrobek;
public boolean jeCislo() {
return (Integer.parseUnsignedInt(vyrobek) != NaN);
}
public String dejCisloVyrobku() {
return vyrobek;
}
public CisloVyrobku(String vyrobek) {
this.vyrobek = vyrobek;
}
public String toString() {
return vyrobek;
}
}
String formatted = String.format("%03d", 15);
% = řídící znak
0 = znak, který se bude přidávat jako prefix
3 = celková délka tiknutého řetězce včetně délky parametru
15 = číslo, které se má naformátovat
V tomto případě se vytiskne: 015
Uplne nesmyslna a zbytecna trida, ktera ve vysledku jen zneprehledni celou aplikaci. Bud at pracuje se stringem a nebo integerem. pokud chce pracovat s integerem ale aby to "hezky" vypadalo, tak at ve vrstve, ktera to ma na starosti resi formatovani, ale ne si zabordelit program podobnyma "vytvorama". Uz ted mi je lito cloveka, co by to mel po case refaktorovat...
PS. Nemyslim to nijak zle, jen mi z implementace te tve myslenky beha mraz po zadech.
Síce to je "Číslo" tovaru ale v modeli by som to ukladal ako String, rovnako ako napr. cenu by som zadával v BigDecimal alebo počet kusov v integeri.
class Tovar {
private long id;
private BigDecimal cena;
private int pocetKusov;
private String cisloTovaru;
}
Právěže by se to refaktorovalo dobře.
Navíc by šlo zajistit, aby hodnota byla navenek vždy platná.
Mozem poprosit o nejaku konkretnu ukazku ? Lebo neviem sa z toho vymotať.
public class Info {
int cisloTovaru;
int cenaTovaru;
public void vypisVsetko() {
System.out.println("Cislo tovaru je " + cisloTovaru);
System.out.println("Cena je " + cenaTovaru);
}
}
public class TEST {
public static void main(String[] args) {
//tovar č.1
Info tovar = new Info();
tovar.cisloTovaru = 015;
tovar.cenaTovaru = 30;
tovar.vypisVsetko();
}
}
Však ukázku kódu uz máš v mém příspěvku výše...
Si testoval na jednom vstupe? A keď teraz zadáš číslo tovaru 0046 alebo 00015... tak ti vypíše správny výsledok? Budeš musieť zmeniť aj to formátovanie, ak si si teda nenapísal niečo univerzálne. Osobne si myslím že je hlúposť takéto údaje ukladať ako číslo.
Ešte otázka..čo ak to chcem používať na viacero tovarov ?
public class Info {
int cenaTovaru;
String cisloTovaru = String.format("%03d", 15);
String cisloTovaru1 = String.format("%05d", 1575);
public void vypisVsetko() {
System.out.println("Cislo tovaru je " + cisloTovaru);
System.out.println("Cena je " + cenaTovaru);
}
}
V tomto prípade dostanem stále to isté číslo pretože je tak uložené v premennej.
public class TEST {
public static void main(String[] args) {
//tovar č.1
Info tovar = new Info();
tovar.cisloTovaru = "015";
tovar.cenaTovaru = 30;
tovar.vypisVsetko();
System.out.println(" ");
//tovar c.2
Info tovar1 = new Info();
tovar1.cisloTovaru1 = "01575";
tovar1.cenaTovaru = 25;
tovar1.vypisVsetko();
}
}
Viem to obísť tak že si vytvorím pre každý vlastnú premennú ale to mi nepripadá ako najlepšie riešienie.
Určite to nie je dobré riešenie. Čo ak vopred nepoznáš aké číslo tovaru ti príde alebo ich budeš mať X veľa? Ukladaj to ako String a ak nechceš aby tam boli iné znaky ako číslice tak pri najhoršom napíšeš nejakú validáciu.
Něco takového?
import java.lang.IllegalArgumentException;
import java.util.regex.Pattern;
public class Vyrobok {
private String id = null;
private Float cena = null;
private static boolean testId(String id) {
return Pattern.compile("^\d{1,3}$").matcher(id).matches();
}
private static boolean testCena(Float c) {
return Pattern.compile("^[0-9]+([\.\,][0-9]+)?[\s]?Kč$").matcher(c.toString()).matches();
}
public String dejIdVyrobku() {
return id;
}
public Vyrobok(String id, Float cena) throws IllegalArgumentException {
if(testId(id)) { throw new IllegalArgumentException("Chybny format Id vyrobku"); }
if(testCena(cena)) { throw new IllegalArgumentException("Chybny format ceny"); }
this.id = id;
this.cena = cena;
}
@Override
public String toString() {
return "{Vyrobok Id je: " + id + ", jeho cena je: " + cena + "}";
}
public static void main(String[] args) {
Vyrobok id = new Vyrobok("015", new Float(1000));
// Vyrobok id2 = new Vyrobok("O15", new Float(1000)); //neprojde
System.out.println(id);
}
}
Nepoužívaj float alebo double pre prácu s peňažnými hodnotami
https://stackoverflow.com/…ent-currency
Zobrazeno 15 zpráv z 15.