2010-01-28 1 views
2

Une valeur de champ de formulaire comme 45,234 doit être insérée dans le DB sous la forme 45234. Lorsque j'essaie de faire insérer pour 45,234, tout ce qu'il obtient dans le DB est 0. Note: - Je suis en mesure d'insérer 45.234 comme 45.234 dans la base de données SQL. Le champ de formulaire est nommé costOfShares, qui doit être inséré dans la table ShareVales (SQL Server 2005). J'utilise CF8.ColdFusion: comment insérer des nombres (ayant une virgule (,)/iserted actuellement 0) des champs de formulaire dans la base de données

SQL

table:-ShareVales; field:-costOfShares; DataType:-float 

ColdFusion (page de formulaire)

<li> 
    <cfinput size="8" maxlength="20" name="costOfShares" 
    id="costOfShares" value="#share.GetcostOfShares()#"> 
</li> 

Share.cfc: -

<cfcomponent> 
    <cfscript> Variables.CostOfShare </cfscript> 
<cffunction name="GetCostOfShare" returntype="numeric" access="public" output="false">   
    <cfscript> variables.CostOfShare; </cfscript> 
</cffunction> 

<cffunction name="SetCostOfShare" retuntype="void" access="public" output="false">  
    <cfargument name="costOfShare" type="string" required="true"> 
     <cfscript> variables. costOfShare = arguments. costOfShare; </cfscript> 
    </cffunction> 
</cfcomponent> 

ColdFusion (page requête)

<cffunction> 
    <cfargumnet> 
    <cfquery …> 
     INSERT INTO ShareVales(shareUnitId, costOfShares) 
     VALUES (
     <cfqueryparam cfsqltype="cf_sql_integer" 
         value="#arguments.share.GetshareUnitId()#">, 
     <cfqueryparam cfsqltype="cf_sql_float" 
         value="#arguments.share.GetcostOfShares()#">); 
    </cfquery> 
</cffunction> 

Lorsque j'utilise ce qui suit directement dans l'éditeur de requête:

INSERT into share(setCostOfShare) 
values(Cast(replace('5,322,444',',','') as float)) 

réussit. L'erreur est lors de l'utilisation de cfquery/cfqueryparam dans le modèle ColdFusion. Donc, comment insérer le 45234 lorsque le champ de formulaire costOfShares contient une valeur avec des virgules?

Répondre

3

Si on tape une virgule, la bande dehors avant d'essayer d'insérer.

+0

INSERT en partage (setCostOfShare) values ​​(Cast (remplacez '(5,322,444', ',', '') par float)) ... est une réussite dans l'éditeur de requêtes DB-SQL .... mais l'erreur est lors de l'utilisation de cfquery/ dans le template coldfusion. – vas

+2

En Allemagne, par exemple, la virgule signifie le début des décimales, donc vous ne pouvez pas le supprimer. D'autant plus que le champ DB est 'float', ce qui implique que les décimales * sont * significatives. Analyser l'entrée comme un nombre dans ColdFusion * avant * l'INSERT est le seul moyen de le faire. – Tomalak

2
LSParseNumber("45,234", "French (standard)") 

Ou si "Français (standard)" est déjà vos paramètres régionaux par défaut du système standard du système, il suffit d'utiliser:

LSParseNumber("45,234") 

Ou ...

<cfset setLocale("French (standard)")> 
<cfset value = LSParseNumber("45,234")> 

Ils reviennent 45.234 (si vous voulez 45234 à la place, utilisez les paramètres régionaux américains, voir doc!)

vous permet de stocker costOfShares comme valeur numérique ColdFusion valide (aka, utilisez '.' au lieu de ','), et utilisez uniquement LSNumberFormat() ou LSLSCurrencyFormat() pour afficher la valeur sur la vue. De cette façon, vous n'avez même pas à LSParse le numéro, sauf si le numéro est créé par l'utilisateur, et il utilise ','.

+0

Puis-je utiliser ...... INSERT .... INTO .... VALUES (..., ); – vas

+1

Ya, bien sûr ... tant que votre locale par défaut peut décoder la virgule comme symbole pour la décimale. Si ce n'est pas le cas, vous devez d'abord définir setLocale() ou transmettre les paramètres régionaux en tant que second argument de LSParseNumber(). – Henry

+0

Henry J'ai ajouté le code de la page de formulaire, et encore je reçois la valeur de "0" au lieu de dire "45 334" .En outre, le local US, Fournit "français" conseillé – vas

1

probablement le type de données est un flottant ou quelque chose. Les virgules ne sont pas des caractères valides dans un flottant (sauf pour les paramètres régionaux européens). Vous voulez probablement récupérer la valeur de la base de données avec une virgule (mais pas nécessairement la stocker avec une virgule). Cela signifierait probablement en utilisant la fonction INVISIBLE dans une commande SELECT:

http://technet.microsoft.com/en-us/library/ms174450.aspx 
+0

Oui le type de données est un flottant. Je veux insérer un nombre avec une virgule dedans. Exemple: - quand j'insère la valeur 45,234 (avec une virgule) sous la forme '0' est rempli dans la base de données SQL. Puis-je utiliser CAST()/CONVERT dans la requête INSERT? – vas

+1

Je pense qu'une partie de la confusion est que vous essayez de soumettre un numéro de style européen (comme 3,5 ou 1,003,14) ou si vous essayez de soumettre des numéros de type US avec des virgules (soit 1 000,00 ou 24 123,45). Si vous faites ce dernier je ne pense pas que ce soit possible. La base de données stocke les nombres au format binaire afin que vous ne puissiez pas stocker les virgules.Plutôt votre question pourrait être "comment puis-je obtenir les chiffres afin qu'ils soient beaux", si c'est le cas, alors vous devez le faire lors d'un SELECT pour convertir le float en une belle chaîne de recherche. – mlathe

+2

Les flottants BTW sont d'horribles types de données, ne les utilisez jamais si vous faites des calculs. Utilisez décimal ou numérique à la place, sauf si vous aimez obtenir des erreurs d'arrondi. – HLGEM

-1

Vous ne savez pas si cela vous aidera ou non, mais mettez simplement le remplacement à l'intérieur de cfqueryparam. De cette façon, il transmet à SQL Server la "version déjà nettoyée".Ou, faites CF exécuter un remplacement sur la variable et le nettoyer avant même d'essayer la requête.

Ou, avez CF exécuter un remplacer sur la variable et le nettoyer avant même de le passer en argument.

+0

utiliser la fonction correcte, qui devrait être LSParseNumber() – Henry

+0

ERREUR: - Données invalides arguments.share.GetcostOfShares() pour CFSQLTYPE CF_SQL_FLOAT. – vas

+0

"Ou, avoir CF exécuter un remplacer sur la variable et le nettoyer avant même d'essayer la requête Ou, avoir CF exécuter un remplacer sur la variable et le nettoyer avant même de le passer en argument." Ce n'est pas parce que "copier/coller" n'a pas fonctionné que ma réponse n'a pas été bonne. –

Questions connexes