Skip to content

Commit 5f007ec

Browse files
committed
Force US Locale for floats.
#918 showed that locales which use commas for floating-point numbers can cause problems with output formats. This commit fixes a number of other cases. - Force Locale.US when outputting floats to files/streams - Usually don't force Locale.US when outputting floats to standard out & logging (would lead to more consistent logs but breaks localization) - Replace some `println(String.format(` calls with Java 5 `printf`
1 parent 600763e commit 5f007ec

File tree

21 files changed

+106
-94
lines changed

21 files changed

+106
-94
lines changed

biojava-core/src/main/java/org/biojava/nbio/core/util/SingleLinkageClusterer.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public String toString() {
6969
if (closestDistance==Double.MAX_VALUE) {
7070
closestDistStr = String.format("%6s", "inf");
7171
} else {
72-
closestDistStr = String.format("%6.2f",closestDistance);
72+
closestDistStr = String.format(Locale.US, "%6.2f",closestDistance);
7373
}
7474

7575
return "["+first+","+second+"-"+closestDistStr+"]";
@@ -386,11 +386,11 @@ private String matrixToString() {
386386
}
387387
else if (i<j) {
388388
if (matrix[i][j]==Double.MAX_VALUE) sb.append(String.format("%6s ","inf"));
389-
else sb.append(String.format("%6.2f ",matrix[i][j]));
389+
else sb.append(String.format(Locale.US, "%6.2f ",matrix[i][j]));
390390
}
391391
else {
392392
if (matrix[j][i]==Double.MAX_VALUE) sb.append(String.format("%6s ","inf"));
393-
else sb.append(String.format("%6.2f ",matrix[j][i]));
393+
else sb.append(String.format(Locale.US, "%6.2f ",matrix[j][i]));
394394
}
395395
}
396396
sb.append("\n");
@@ -400,4 +400,3 @@ else if (i<j) {
400400
}
401401

402402
}
403-

biojava-protein-disorder/src/main/java/org/biojava/nbio/ronn/ORonn.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ void writeResults(final float[] meanScores, final char[] seqs) {
111111
out.println(">" + sequence.getId());
112112
if (layout == ResultLayout.VERTICAL) {
113113
for (int i = 0; i < meanScores.length; i++) {
114-
out.printf("%c\t%.2f%n", seqs[i], meanScores[i]);
115-
//out.printf("%c\t%f%n", seqs[i], meanScores[i]);
114+
out.printf(Locale.US, "%c\t%.2f%n", seqs[i], meanScores[i]);
115+
//out.printf(Locale.US, "%c\t%f%n", seqs[i], meanScores[i]);
116116
}
117117
} else {
118118
final StringBuilder seqLine = new StringBuilder();

biojava-protein-disorder/src/main/java/org/biojava/nbio/ronn/ORonnModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.io.File;
3333
import java.io.FileNotFoundException;
3434
import java.io.PrintWriter;
35+
import java.util.Locale;
3536

3637

3738

@@ -133,7 +134,7 @@ public void getScores(final File outfile) throws FileNotFoundException {
133134
}
134135
}
135136
for (int i = 0; i < scores.length; i++) {
136-
output.printf("%c\t%f\n", query[i], scores[i]);
137+
output.printf(Locale.US, "%c\t%f\n", query[i], scores[i]);
137138
}
138139
output.close();
139140
}

biojava-structure/src/main/java/org/biojava/nbio/structure/PDBCrystallographicInfo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import javax.vecmath.Matrix4d;
2727
import java.io.Serializable;
28+
import java.util.Locale;
2829

2930
/**
3031
* A class to hold crystallographic information about a PDB structure.
@@ -233,7 +234,7 @@ public String toString() {
233234
(sg==null?"no SG":sg.getShortSymbol())+" - "+
234235

235236
(cell==null?"no Cell":
236-
String.format("%.2f %.2f %.2f, %.2f %.2f %.2f",
237+
String.format(Locale.US, "%.2f %.2f %.2f, %.2f %.2f %.2f",
237238
cell.getA(),cell.getB(),cell.getC(),cell.getAlpha(),cell.getBeta(),cell.getGamma()) )+
238239
(ncsOperators==null? "" : String.format(" - %d NCS operators",ncsOperators.length) )+
239240
"]";

biojava-structure/src/main/java/org/biojava/nbio/structure/align/fatcat/calc/AFPChainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public static void doChainAfp(FatCatParameters params, AFPChain afpChain,Atom[]
151151

152152
int currafp = maxafp;
153153
if(debug)
154-
System.out.println(String.format("maximum score %f, %d\n", maxsco, twi[currafp]));
154+
System.out.printf("maximum score %f, %d%n%n", maxsco, twi[currafp]);
155155

156156
//trace-back from maxafp (maxsco)
157157

biojava-structure/src/main/java/org/biojava/nbio/structure/align/fatcat/calc/FCAlignHelper.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,11 @@ private void rep()
252252
private void checkAlign(){
253253

254254
if(sapp[0] != 0) {
255-
System.err.println(String.format("warn: not a local-alignment result, first operation %d\n", sapp[0]));
255+
System.err.printf("warn: not a local-alignment result, first operation %d%n%n", sapp[0]);
256256
}
257257
double sco = checkScore();
258258
if(Math.abs(sco - alignScore) > 1e-3) {
259-
System.err.println(String.format("FCAlignHelper: warn: alignment scores are different %f(check) %f(align)\n", sco, alignScore));
259+
System.err.printf("FCAlignHelper: warn: alignment scores are different %f(check) %f(align)%n%n", sco, alignScore);
260260
}
261261
}
262262

@@ -330,5 +330,3 @@ else if (op > 0) {
330330
}
331331

332332
}
333-
334-

biojava-structure/src/main/java/org/biojava/nbio/structure/align/model/AFPChain.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.ArrayList;
2929
import java.util.Arrays;
3030
import java.util.List;
31+
import java.util.Locale;
3132
import java.util.Map;
3233

3334
/**
@@ -366,22 +367,22 @@ public String toString(){
366367
str.append(this.getCa1Length());
367368
str.append("\tLen2:");
368369
str.append(this.getCa2Length());
369-
str.append(String.format("\tscore: %.2f",this.getAlignScore()));
370+
str.append(String.format(Locale.US, "\tscore: %.2f",this.getAlignScore()));
370371
str.append("\t");
371372
if ( algorithmName.equalsIgnoreCase(CeMain.algorithmName) || algorithmName.equalsIgnoreCase(CeSideChainMain.algorithmName)){
372373
str.append("Z-score:");
373-
str.append(String.format("%.2f",this.getProbability()));
374+
str.append(String.format(Locale.US, "%.2f",this.getProbability()));
374375
} else {
375376
str.append("Probability:");
376-
str.append(String.format("%.2e",this.getProbability()));
377+
str.append(String.format(Locale.US, "%.2e",this.getProbability()));
377378
}
378379
str.append("\tRMSD:");
379-
str.append(String.format("%.2f",this.getTotalRmsdOpt()));
380+
str.append(String.format(Locale.US, "%.2f",this.getTotalRmsdOpt()));
380381

381382
str.append("\tSeqID:");
382-
str.append(String.format("%.0f",getIdentity()*100));
383+
str.append(String.format(Locale.US, "%.0f",getIdentity()*100));
383384
str.append("%\tSeqSim:");
384-
str.append(String.format("%.0f",getSimilarity()*100));
385+
str.append(String.format(Locale.US, "%.0f",getSimilarity()*100));
385386
str.append("%\tCov1:");
386387
str.append(this.getCoverage1());
387388
str.append("%\tCov2:");
@@ -390,7 +391,7 @@ public String toString(){
390391

391392
if ( tmScore != -1) {
392393
str.append("\ttmScore:");
393-
str.append(String.format("%.2f",tmScore));
394+
str.append(String.format(Locale.US, "%.2f",tmScore));
394395
}
395396
str.append(newline);
396397

biojava-structure/src/main/java/org/biojava/nbio/structure/align/model/AfpChainWriter.java

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import java.io.StringWriter;
3636
import java.util.List;
37+
import java.util.Locale;
3738

3839
/**
3940
* A class to convert the data in an AfpChain object to various String outputs.
@@ -67,7 +68,7 @@ public static String toScoresList(AFPChain afpChain){
6768

6869
if ( afpChain.getAlgorithmName().startsWith("CE")) {
6970
writer.append("Z-score " );
70-
writer.append(String.format("%.2f", afpChain.getProbability()));
71+
writer.append(String.format(Locale.US, "%.2f", afpChain.getProbability()));
7172
writer.append(newline);
7273
}
7374

@@ -196,10 +197,10 @@ public static String toFatCatCore(
196197
txt.append("Short match");
197198
return txt.toString();
198199
}
199-
//txt.append(String.format("raw-score: %.2f norm.-score: %.2f ", alignScore, normAlignScore));
200+
//txt.append(String.format(Locale.US, "raw-score: %.2f norm.-score: %.2f ", alignScore, normAlignScore));
200201

201202
if ( longHeader ) {
202-
txt.append(String.format( "Twists %d ini-len %d ini-rmsd %.2f opt-equ %d opt-rmsd %.2f chain-rmsd %.2f Score %.2f align-len %d gaps %d (%.2f%%)",
203+
txt.append(String.format(Locale.US, "Twists %d ini-len %d ini-rmsd %.2f opt-equ %d opt-rmsd %.2f chain-rmsd %.2f Score %.2f align-len %d gaps %d (%.2f%%)",
203204
blockNum - 1, totalLenIni, totalRmsdIni, optLength, totalRmsdOpt, chainRmsd, alignScore,
204205
alnLength, gapLen, (100.0 * gapLen/alnLength)) );
205206
txt.append(newline);
@@ -213,12 +214,12 @@ public static String toFatCatCore(
213214
}
214215

215216

216-
//txt.append(String.format("P-value %.2e Afp-num %d Identity %.2f%% Similarity %.2f%% norm.-score: %.2f"+newline, probability, afpNum, identity * 100, similarity * 100, normAlignScore));
217+
//txt.append(String.format(Locale.US, "P-value %.2e Afp-num %d Identity %.2f%% Similarity %.2f%% norm.-score: %.2f"+newline, probability, afpNum, identity * 100, similarity * 100, normAlignScore));
217218

218219
if ( longHeader) {
219220
printScore(txt,algorithmName,probability,longHeader);
220221

221-
txt.append(String.format("Afp-num %d Identity %.2f%% Similarity %.2f%%", afpNum, identity * 100, similarity * 100));
222+
txt.append(String.format(Locale.US, "Afp-num %d Identity %.2f%% Similarity %.2f%%", afpNum, identity * 100, similarity * 100));
222223
txt.append(newline);
223224
}
224225

@@ -229,7 +230,7 @@ public static String toFatCatCore(
229230
int fragLen = 8 ; // FatCatParameters.DEFAULT_FRAGLEN;
230231
for(i = 0; i < blockNum; i ++) {
231232
gap = blockGap[i] /( (double)blockGap[i] + fragLen * blockSize[i]);
232-
txt.append(String.format( "Block %2d afp %2d score %5.2f rmsd %5.2f gap %d (%.2f%%)",
233+
txt.append(String.format(Locale.US, "Block %2d afp %2d score %5.2f rmsd %5.2f gap %d (%.2f%%)",
233234
i, blockSize[i], blockScore[i], blockRmsd[i], blockGap[i], gap));
234235
txt.append(newline);
235236
}
@@ -389,29 +390,29 @@ public static void printScoresInLines(AFPChain afpChain, int blockNum, int optLe
389390
int alnLength, int gapLen, double identity, double similarity, StringBuffer txt)
390391
{
391392
if ( blockNum - 1 > 0) {
392-
txt.append(String.format( "Twists %d ", blockNum -1 ));
393+
txt.append(String.format(Locale.US, "Twists %d ", blockNum -1 ));
393394
txt.append(newline);
394395
}
395396

396-
txt.append(String.format("Equ: %d ", optLength));
397+
txt.append(String.format(Locale.US, "Equ: %d ", optLength));
397398
txt.append(newline);
398-
txt.append(String.format("RMSD: %.2f ", totalRmsdOpt));
399+
txt.append(String.format(Locale.US, "RMSD: %.2f ", totalRmsdOpt));
399400
txt.append(newline);
400-
txt.append(String.format("Score: %.2f ", alignScore));
401+
txt.append(String.format(Locale.US, "Score: %.2f ", alignScore));
401402
txt.append(newline);
402-
txt.append(String.format("Align-len: %d ", alnLength));
403+
txt.append(String.format(Locale.US, "Align-len: %d ", alnLength));
403404
txt.append(newline);
404-
txt.append(String.format("Gaps: %d (%.2f%%)",
405+
txt.append(String.format(Locale.US, "Gaps: %d (%.2f%%)",
405406
gapLen, (100.0 * gapLen/alnLength)) );
406407
txt.append(newline);
407408
if ( afpChain.getTMScore() >= 0) {
408-
txt.append(String.format("TM-score: %.2f",afpChain.getTMScore()));
409+
txt.append(String.format(Locale.US, "TM-score: %.2f",afpChain.getTMScore()));
409410
txt.append(newline);
410411
}
411412
txt.append(newline);
412-
txt.append(String.format("Identity: %.2f%% ", identity * 100 ));
413+
txt.append(String.format(Locale.US, "Identity: %.2f%% ", identity * 100 ));
413414
txt.append(newline);
414-
txt.append(String.format("Similarity: %.2f%%", similarity * 100));
415+
txt.append(String.format(Locale.US, "Similarity: %.2f%%", similarity * 100));
415416
txt.append(newline);
416417
}
417418

@@ -421,16 +422,16 @@ private static void printScore(StringBuffer txt,
421422
boolean longHeader)
422423
{
423424
if ( algorithmName.equalsIgnoreCase(CeMain.algorithmName) || algorithmName.equalsIgnoreCase(CeSideChainMain.algorithmName) ){
424-
txt.append(String.format("Z-score %.2f ", probability));
425+
txt.append(String.format(Locale.US, "Z-score %.2f ", probability));
425426
if ( ! longHeader)
426427
txt.append(newline);
427428
} else if ( algorithmName.equalsIgnoreCase(SmithWaterman3Daligner.algorithmName)) {
428429

429430
} else {
430431
if ( longHeader ){
431-
txt.append(String.format("P-value %.2e ",probability));
432+
txt.append(String.format(Locale.US, "P-value %.2e ",probability));
432433
} else {
433-
txt.append(String.format("P-value: %.2e ",probability));
434+
txt.append(String.format(Locale.US, "P-value: %.2e ",probability));
434435
txt.append(newline);
435436
}
436437
}
@@ -1065,15 +1066,15 @@ public static String toDBSearchResult(AFPChain afpChain)
10651066
str.append("\t");
10661067
str.append(afpChain.getName2());
10671068
str.append("\t");
1068-
str.append(String.format("%.2f",afpChain.getAlignScore()));
1069+
str.append(String.format(Locale.US, "%.2f",afpChain.getAlignScore()));
10691070
str.append("\t");
10701071
if ( afpChain.getAlgorithmName().equalsIgnoreCase(CeMain.algorithmName)){
1071-
str.append(String.format("%.2f",afpChain.getProbability()));
1072+
str.append(String.format(Locale.US, "%.2f",afpChain.getProbability()));
10721073
} else {
1073-
str.append(String.format("%.2e",afpChain.getProbability()));
1074+
str.append(String.format(Locale.US, "%.2e",afpChain.getProbability()));
10741075
}
10751076
str.append("\t");
1076-
str.append(String.format("%.2f",afpChain.getTotalRmsdOpt()));
1077+
str.append(String.format(Locale.US, "%.2f",afpChain.getTotalRmsdOpt()));
10771078
str.append("\t");
10781079
str.append(afpChain.getCa1Length());
10791080
str.append("\t");
@@ -1083,7 +1084,7 @@ public static String toDBSearchResult(AFPChain afpChain)
10831084
str.append("\t");
10841085
str.append(afpChain.getCoverage2());
10851086
str.append("\t");
1086-
str.append(String.format("%.2f",afpChain.getIdentity()));
1087+
str.append(String.format(Locale.US, "%.2f",afpChain.getIdentity()));
10871088
str.append("\t");
10881089
str.append(afpChain.getDescription2());
10891090
str.append("\t");
@@ -1119,11 +1120,11 @@ public static String toRotMat(AFPChain afpChain)
11191120
origString = String.valueOf(blockNr);
11201121

11211122

1122-
txt.append(String.format(" X"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,0),m.get(1,0), m.get(2,0), shift.getX()));
1123+
txt.append(String.format(Locale.US, " X"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,0),m.get(1,0), m.get(2,0), shift.getX()));
11231124
txt.append( newline);
1124-
txt.append(String.format(" Y"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,1),m.get(1,1), m.get(2,1), shift.getY()));
1125+
txt.append(String.format(Locale.US, " Y"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,1),m.get(1,1), m.get(2,1), shift.getY()));
11251126
txt.append( newline);
1126-
txt.append(String.format(" Z"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,2),m.get(1,2), m.get(2,2), shift.getZ()));
1127+
txt.append(String.format(Locale.US, " Z"+(blockNr+1)+" = (%9.6f)*X"+ origString +" + (%9.6f)*Y"+ origString +" + (%9.6f)*Z"+ origString +" + (%12.6f)",m.get(0,2),m.get(1,2), m.get(2,2), shift.getZ()));
11271128
txt.append(newline);
11281129
}
11291130
return txt.toString();
@@ -1178,8 +1179,8 @@ public static String toCE(AFPChain afpChain, Atom[] ca1, Atom[] ca2)
11781179
txt.append(")");
11791180
txt.append(newline);
11801181
txt.append(newline);
1181-
txt.append(String.format("Alignment length = %d Rmsd = %.2fA Z-Score = %.1f",optLength,totalRmsdOpt,probability));
1182-
txt.append(String.format(" Gaps = %d(%.1f%%) CPU = %d ms. Sequence identities = %.1f%%",gapLen,( gapLen*100.0/optLength),calculationTime,identity*100));
1182+
txt.append(String.format(Locale.US, "Alignment length = %d Rmsd = %.2fA Z-Score = %.1f",optLength,totalRmsdOpt,probability));
1183+
txt.append(String.format(Locale.US, " Gaps = %d(%.1f%%) CPU = %d ms. Sequence identities = %.1f%%",gapLen,( gapLen*100.0/optLength),calculationTime,identity*100));
11831184

11841185
int linelen = 70;
11851186
String a;

biojava-structure/src/main/java/org/biojava/nbio/structure/align/multiple/MultipleAlignmentImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.Serializable;
2424
import java.util.ArrayList;
2525
import java.util.List;
26+
import java.util.Locale;
2627

2728
import org.biojava.nbio.structure.Atom;
2829
import org.biojava.nbio.structure.StructureException;
@@ -138,7 +139,7 @@ public String toString() {
138139
+ " \nCore Length: " + getCoreLength();
139140
for (String score : getScores()) {
140141
resume += " \n" + score + ": ";
141-
resume += String.format("%.2f", getScore(score));
142+
resume += String.format(Locale.US, "%.2f", getScore(score));
142143
}
143144
return resume;
144145
}

biojava-structure/src/main/java/org/biojava/nbio/structure/align/multiple/util/MultipleAlignmentWriter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.io.StringWriter;
2626
import java.util.ArrayList;
2727
import java.util.List;
28+
import java.util.Locale;
2829

2930
import javax.vecmath.Matrix4d;
3031

@@ -215,7 +216,7 @@ public static String toTransformMatrices(MultipleAlignment alignment) {
215216
for (int str = 0; str < alignment.size(); str++) {
216217
String origString = "ref";
217218

218-
txt.append(String.format(" X"+(str+1)+ " = (%9.6f)*X"+
219+
txt.append(String.format(Locale.US, " X"+(str+1)+ " = (%9.6f)*X"+
219220
origString +" + (%9.6f)*Y"+
220221
origString +" + (%9.6f)*Z"+
221222
origString +" + (%12.6f)",
@@ -224,7 +225,7 @@ public static String toTransformMatrices(MultipleAlignment alignment) {
224225
btransforms.get(str).getElement(0,2),
225226
btransforms.get(str).getElement(0,3)));
226227
txt.append( "\n");
227-
txt.append(String.format(" Y"+(str+1)+" = (%9.6f)*X"+
228+
txt.append(String.format(Locale.US, " Y"+(str+1)+" = (%9.6f)*X"+
228229
origString +" + (%9.6f)*Y"+
229230
origString +" + (%9.6f)*Z"+
230231
origString +" + (%12.6f)",
@@ -233,7 +234,7 @@ public static String toTransformMatrices(MultipleAlignment alignment) {
233234
btransforms.get(str).getElement(1,2),
234235
btransforms.get(str).getElement(1,3)));
235236
txt.append( "\n");
236-
txt.append(String.format(" Z"+(str+1)+" = (%9.6f)*X"+
237+
txt.append(String.format(Locale.US, " Z"+(str+1)+" = (%9.6f)*X"+
237238
origString +" + (%9.6f)*Y"+
238239
origString +" + (%9.6f)*Z"+
239240
origString +" + (%12.6f)",

0 commit comments

Comments
 (0)