0
votes

Comment convertir des nombres de la chaîne à flotter avec les zéros suivants dans JavaScript?

Dans mon application réactive, je reçois un coût (comme 990.00) de l'API comme une chaîne. Je le stocke dans une table d'interface utilisateur matérielle avec la fonction de tri. Pour trier le coût, il devrait être au format numérique. J'utilise Tofloat () pour le convertir en un nombre mais je reçois 900 seulement. Si je le modifie à Tofloat (). TOFIXED (2), il sera à nouveau converti sur une chaîne. Si je le modifie à Tofloat (). Tour (2), pas de sortie du tout.

let counter = 0;
function createData(projectId, projectName, projectStatus, totalCost, paymentStatus, clientName, email, phone) {
    counter += 1;
    return { id: counter, projectId, projectName, projectStatus, totalCost, paymentStatus, clientName, email, phone };
}

function desc(a, b, orderBy) {
    if (b[orderBy] < a[orderBy]) {
        return -1;
    }
    if (b[orderBy] > a[orderBy]) {
        return 1;
    }
    return 0;
}

function getSorting(order, orderBy) {
    return order === 'desc' ? (a, b) => desc(a, b, orderBy) : (a, b) => -desc(a, b, orderBy);
}

class AllTable extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            order: 'asc',
            orderBy: 'userName',
            data: [],
        };
    }

componentDidMount() {
        API.get('url')
            .then(({ data }) => {
                this.setState({
                    data: data.response.map(
                        job => (
                            createData(
                                job.project_id,
                                parseFloat(job.total),
                                job.payment_status,
                            )
                        )
                    )
                })
            })
            .catch((err) => {
                console.log("AXIOS ERROR: ", err);
            })
    }

handleRequestSort = (event, property) => {
        const orderBy = property;
        let order = 'desc';
        if (this.state.orderBy === property && this.state.order === 'desc') {
            order = 'asc';
        }
        this.setState({ order, orderBy });
    };

    render(){
      return(
          {data
            .sort(getSorting(order, orderBy))
               .map(n => {
                  return (
                    <TableRow
                        hover
                        tabIndex={-1}
                        key={n.id}
                    >
                       <TableCell className={classes.tdWidth}><div className={classes.cellWidth}>${n.totalCost}</div></TableCell>
                       <TableCell className={classes.tdWidth}><div className={classes.cellWidth}>{n.paymentStatus}</div></TableCell>
                    </TableRow>
           })}
      )
}

}


10 commentaires

Vous ne le faites pas; Un nombre ne peut pas stocker les zéros suivants. C'est très probablement un problème XY, s'il vous plaît dites-nous quel est votre objectif.


Dans JS, il y a juste un numéro.


S'il vous plaît ajouter la partie de tri. BTW, où est tofloat de?


mais je reçois 900 seulement c'est ce que vous avez.


Je ne vois pas le problème tbh; 1. Réponse de l'API 2. Parse to Float 3. Trier 4. Sortie sous forme TOFIXED (2)


Dupliqué possible de Precision numérique JavaScript sans convertir en chaîne et Comment puis-je arrondir un numéro en JavaScript? .Tofixed () renvoie une chaîne?


@Chrisg j'ai mis à jour la question avec mon composant de réact. J'ai besoin de trier la colonne de coûts et les coûts doivent être en chiffres (une devise)


@Ninascholz j'ai ajouté la partie de tri


Si ce que vous vraiment veux, c'est un numéro représentant la devise, il y a un DOM API pour cela.


Avez-vous vu mon Commentaire précédent ? Il n'est pas nécessaire de créer un numéro avec des zéros suivants. Vous triez le numéro, puis appelez toofixed (2) dessus lorsque vous l'affichez.


3 Réponses :


-1
votes

Essayez ceci:

var cost = '900.00'
var numericCost = parseFloat(cost).toFixed(2)


1 commentaires

Veuillez lire la question suivante: " si je le modifie à Tofloat (). TOFIXED (2), il sera reconvertir à nouveau en une chaîne "



0
votes

Donc, je vais reformuler ma réponse, TOFIXED renvoie toujours un numéro de chaîne car les décimales JavaScript ne peuvent pas être représentées dans des systèmes binaires à virgule flottante avec une précision complète, par exemple 10.2, c'est en fait 10.2 ........ (nombreux chiffres après point décimal)

afin de corriger une partie du nombre en tant que chaîne afin de nous donner le résultat que nous voulons avec précision.

afin de résoudre ce problème Créez votre propre fonction, et voici un lien pour vous aider: https://exoboy.wordpress.com/2011/07/14/LLE-PROBROMEMS-WITH-TOFIXED-IN-JAVAScript/

Vous aurez besoin du code suivant: (Je ne suis pas propriétaire du code que je l'ai eu du lien que j'ai mentionné) xxx

afin d'appeler cette fonction que vous devez utiliser num.trimnum (lieux , arrondi); où des endroits sont de nombreux endroits après point décimal, et l'arrondi est une valeur de chaîne ("ronde" / "plafond" / "étage")

Cela résoudra votre problème dans la plupart des cas, mais dans votre cas "999.00", il montrera toujours 999, mais cela n'affectera pas le résultat car 999 et 999,00 auront le même résultat


2 commentaires

Veuillez lire la question suivante: " si je le modifie à Tofloat (). TOFIXED (2), il sera reconvertir à nouveau en une chaîne "


J'ai édité la réponse, j'espère que cela vous aidera, bonne chance.



0
votes

Le problème de base que vous essayez de résoudre est de trier par une version du numéro (valeur numérique), puis affichez une autre (une chaîne, avec une précision définie). La solution consiste à séparer ces deux préoccupations, de sorte que vous n'utilisez pas la même valeur pour trier et afficher:

render() {
  let data = this.props.data.sort((a, b) => {
    // This is the sorting function, so we need to treat the values as a number
    return toFloat(a.cost) - toFloat(b.cost);
  });

  return data.map(n => {
    // Now we're showing the data, so treat it as a string
    // It's already a string fetched from the API in the format needed, so just use directly
    return (
      <TableRow key={n.id}>
        <TableCell>{n.cost}</TableCell>
      </TableRow>
    );
  });
}


0 commentaires