Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: Nuly na začiatku

Java Java Nuly na začiatku American English version English version

Aktivity (1)
Avatar
Peter Andras
Člen
Avatar
Peter Andras:20. září 13:59

Čaute,prichádzam s otázkou ako docieliť aby mi v Jave bralo nuly na začiatku ?

Učím sa programovať,som na začiatku OOP a chcel by som si z doterajších mojich naučených schopností urobiť ako taký program.
Mám určitý tovar a každý tovar ma svoje číslo.Číslo tovaru je napr. v tvare 0046 alebo 015.
Ja si robím program len taký informatívny,po­mocou objektov si tam všetky údaje napíšem sám bez toho aby potom užívateľ niečo zadával.Program len spustím a vypíše mi všetky informácie ktoré som zadal o každom tovare.
Ak zadám tovaru číslo 015 tak 0 hodí automaticky preč.
Otázka znie ako docielim aby tam zostala ? V predchádzajúcich tutorialoch som si nič ohľadom toho nevšimol,ak som to prehliadol stačí mi link.
Ďakujem pekne

Editováno 20. září 14:00
 
Odpovědět 20. září 13:59
Avatar
Odpovídá na Peter Andras
Michal Haňáček:20. září 14:07

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 ...

Nahoru Odpovědět  +1 20. září 14:07
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Jirka
Člen
Avatar
Odpovídá na Peter Andras
Jirka:20. září 14:32

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;
}
}
Nahoru Odpovědět 20. září 14:32
Kdo nic nedělá, nic nezkazí.
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Peter Andras
Petr Štechmüller:20. září 14:38
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

Nahoru Odpovědět 20. září 14:38
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Jirka
Michal Haňáček:20. září 14:42

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.

Nahoru Odpovědět  +1 20. září 14:42
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Odpovídá na Peter Andras
Matúš Olejník:20. září 14:46

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;
}
Nahoru Odpovědět  +1 20. září 14:46
/* I am not sure why this works but it fixes the problem */
Avatar
Jirka
Člen
Avatar
Odpovídá na Michal Haňáček
Jirka:20. září 14:57

Právěže by se to refaktorovalo dobře.

Navíc by šlo zajistit, aby hodnota byla navenek vždy platná.

Nahoru Odpovědět 20. září 14:57
Kdo nic nedělá, nic nezkazí.
Avatar
Peter Andras
Člen
Avatar
Peter Andras:20. září 15:47

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();
       }

}
 
Nahoru Odpovědět 20. září 15:47
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Peter Andras
Petr Štechmüller:20. září 16:10

Však ukázku kódu uz máš v mém příspěvku výše...

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 20. září 16:10
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Peter Andras
Člen
Avatar
Odpovídá na Petr Štechmüller
Peter Andras:20. září 16:24

Ďakujem pekne,funguje..

 
Nahoru Odpovědět 20. září 16:24
Avatar
Odpovídá na Peter Andras
Matúš Olejník:20. září 16:45

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.

Nahoru Odpovědět  +1 20. září 16:45
/* I am not sure why this works but it fixes the problem */
Avatar
Peter Andras
Člen
Avatar
Odpovídá na Petr Štechmüller
Peter Andras:20. září 16:57

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.

 
Nahoru Odpovědět 20. září 16:57
Avatar
Odpovídá na Peter Andras
Matúš Olejník:20. září 17:12

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.

Nahoru Odpovědět 20. září 17:12
/* I am not sure why this works but it fixes the problem */
Avatar
Jirka
Člen
Avatar
Odpovídá na Peter Andras
Jirka:20. září 17:15

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);
}
}
Nahoru Odpovědět 20. září 17:15
Kdo nic nedělá, nic nezkazí.
Avatar
Odpovídá na Jirka
Matúš Olejník:20. září 17:33

Nepoužívaj float alebo double pre prácu s peňažnými hodnotami
https://stackoverflow.com/…ent-currency

Nahoru Odpovědět  +1 20. září 17:33
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.