जावास्क्रिप्ट में KB, MB, GB को बाइट्स में आकार बदलने का सही तरीका


258

मुझे PHP के माध्यम से बाइट्स में गुप्त आकार के लिए यह कोड मिला है ।

अब मैं उन आकारों को जावास्क्रिप्ट का उपयोग करके मानव पठनीय आकारों में बदलना चाहता हूं । मैंने इस कोड को जावास्क्रिप्ट में बदलने की कोशिश की, जो इस तरह दिखता है:

function formatSizeUnits(bytes){
  if      (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
  else if (bytes >= 1048576)    { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
  else if (bytes >= 1024)       { bytes = (bytes / 1024).toFixed(2) + " KB"; }
  else if (bytes > 1)           { bytes = bytes + " bytes"; }
  else if (bytes == 1)          { bytes = bytes + " byte"; }
  else                          { bytes = "0 bytes"; }
  return bytes;
}

क्या ऐसा करने का यह सही तरीका है? क्या कोई आसान तरीका है?


5
यह वास्तव में GiB, MiB और KiB में परिवर्तित होता है। यह फ़ाइल आकार के लिए मानक है, लेकिन हमेशा डिवाइस आकार के लिए नहीं।
डेविड श्वार्ट्ज

जवाबों:


761

इससे: ( स्रोत )

function bytesToSize(bytes) {
   var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
   if (bytes == 0) return '0 Byte';
   var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
   return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}

नोट: यह मूल कोड है, कृपया नीचे दिए गए निश्चित संस्करण का उपयोग करें। Aliceljm अब अपने कॉपी किए गए कोड को सक्रिय नहीं करता है


अब, निश्चित संस्करण निर्विवाद है, और ES6'ed: (समुदाय द्वारा)

function formatBytes(bytes, decimals = 2) {
    if (bytes === 0) return '0 Bytes';

    const k = 1024;
    const dm = decimals < 0 ? 0 : decimals;
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

    const i = Math.floor(Math.log(bytes) / Math.log(k));

    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

अब, निश्चित संस्करण: (Stackoverflow के समुदाय द्वारा, + JSCompress द्वारा न्यूनतम )

function formatBytes(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]}

उपयोग:

// formatBytes(bytes,decimals)

formatBytes(1024);       // 1 KB
formatBytes('1024');     // 1 KB
formatBytes(1234);       // 1.21 KB
formatBytes(1234, 3);    // 1.205 KB

डेमो / स्रोत:

function formatBytes(bytes, decimals = 2) {
    if (bytes === 0) return '0 Bytes';

    const k = 1024;
    const dm = decimals < 0 ? 0 : decimals;
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

    const i = Math.floor(Math.log(bytes) / Math.log(k));

    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

// ** Demo code **
var p = document.querySelector('p'),
    input = document.querySelector('input');
    
function setText(v){
    p.innerHTML = formatBytes(v);
}
// bind 'input' event
input.addEventListener('input', function(){ 
    setText( this.value )
})
// set initial text
setText(input.value);
<input type="text" value="1000">
<p></p>

पुनश्च: बदलें k = 1000या sizes = ["..."]आप चाहते हैं ( बिट्स या बाइट्स )


8
(१) बाइट्स = ० "एन / ए" क्यों है? क्या यह केवल "0 B" नहीं है? (2) मैथ.ऑर्ग में सटीक पैरामीटर नहीं है। मैं बेहतर उपयोग करूँगा(bytes / Math.pow(1024, i)).toPrecision(3)
विघटित

4
toFixed(n)संभवतः toPrecision(n)सभी मूल्यों के लिए एक सुसंगत परिशुद्धता की तुलना में अधिक उपयुक्त है । और शून्य शून्य (पूर्व:) से बचने के लिए bytesToSize(1000) // return "1.00 KB"हम उपयोग कर सकते हैं parseFloat(x)। मैं द्वारा अंतिम पंक्ति को बदलने के लिए सुझाव देते हैं: return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];। पिछले परिवर्तन के साथ परिणाम हैं: bytesToSize(1000) // return "1 KB"/ bytesToSize(1100) // return "1.1 KB"/ bytesToSize(1110) // return "1.11 KB/ bytesToSize(1111) // also return "1.11 KB"
MathieuLescure

3
मेरा मानना ​​है कि बहुवचन रूप का उपयोग 0: '0 बाइट्स' के लिए किया जाता है
निमा

14
मैं कहता हूं कि मिनिफ़ाई करना अच्छा है, लेकिन स्टैकएक्सचेंज उत्तर में अधिक क्रिया और पठनीय कोड होना बेहतर है।
दान

2
केबी = केल्विन एसआई इकाइयों में बाइट्स। जो निरर्थक है। यह kB होना चाहिए।
ब्रेनन टी

47
function formatBytes(bytes) {
    var marker = 1024; // Change to 1000 if required
    var decimal = 3; // Change as required
    var kiloBytes = marker; // One Kilobyte is 1024 bytes
    var megaBytes = marker * marker; // One MB is 1024 KB
    var gigaBytes = marker * marker * marker; // One GB is 1024 MB
    var teraBytes = marker * marker * marker * marker; // One TB is 1024 GB

    // return bytes if less than a KB
    if(bytes < kiloBytes) return bytes + " Bytes";
    // return KB if less than a MB
    else if(bytes < megaBytes) return(bytes / kiloBytes).toFixed(decimal) + " KB";
    // return MB if less than a GB
    else if(bytes < gigaBytes) return(bytes / megaBytes).toFixed(decimal) + " MB";
    // return GB if less than a TB
    else return(bytes / gigaBytes).toFixed(decimal) + " GB";
}

34
const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

function niceBytes(x){

  let l = 0, n = parseInt(x, 10) || 0;

  while(n >= 1024 && ++l){
      n = n/1024;
  }
  //include a decimal point and a tenths-place digit if presenting 
  //less than ten of KB or greater units
  return(n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + units[l]);
}

परिणाम:

niceBytes(435)                 // 435 bytes
niceBytes(3398)                // 3.3 KB
niceBytes(490398)              // 479 KB
niceBytes(6544528)             // 6.2 MB
niceBytes(23483023)            // 22 MB
niceBytes(3984578493)          // 3.7 GB
niceBytes(30498505889)         // 28 GB
niceBytes(9485039485039445)    // 8.4 PB

15

आप filesizejs लाइब्रेरी का उपयोग कर सकते हैं ।


मुझे लगता है कि यह पुस्तकालय सटीक प्रतिनिधित्व देता है, क्योंकि 1024 बाइट्स 1 KB है, 1000 बाइट्स (जैसा कि यहां कुछ अन्य समाधानों द्वारा प्रदान किया गया है)। धन्यवाद @ माउरोच्चि
WM

3
@ यह कथन सत्य नहीं है। 1kB = 1000 बाइट्स। एक Kibibyte में 1024 बाइट्स हैं। अतीत में भ्रम की स्थिति रही है इसलिए ये दो शब्द आकार में अंतर को ठीक से समझाते हैं।
ब्रेनन टी

2
@ ब्रेननॉट यह निर्भर करता है कि आप कितने साल के हैं। 1KB 1024 बाइट्स हुआ करता था और एक निश्चित उम्र से अधिक के लोग अभी भी इसे इस तरह से देखते हैं।
kojow7

14

बाइट्स से संबंधित आकारों का प्रतिनिधित्व करने के लिए 2 वास्तविक तरीके हैं, वे SI इकाइयाँ (10 ^ 3) या IEC इकाइयाँ (2 ^ 10) हैं। JEDEC भी है लेकिन उनका तरीका अस्पष्ट और भ्रमित करने वाला है। मैंने देखा कि अन्य उदाहरणों में त्रुटियां हैं जैसे कि किलोबाइट का प्रतिनिधित्व करने के लिए kB के बजाय KB का उपयोग करना इसलिए मैंने एक फ़ंक्शन लिखने का फैसला किया है जो वर्तमान में मापी गई इकाइयों की सीमा का उपयोग करके इनमें से प्रत्येक मामले को हल करेगा।

अंत में एक प्रारूपण बिट है जो संख्या को थोड़ा बेहतर बना देगा (कम से कम मेरी आंख में) उस स्वरूपण को हटाने के लिए स्वतंत्र महसूस करें यदि यह आपके उद्देश्य के अनुरूप नहीं है।

का आनंद लें।

// pBytes: the size in bytes to be converted.
// pUnits: 'si'|'iec' si units means the order of magnitude is 10^3, iec uses 2^10

function prettyNumber(pBytes, pUnits) {
    // Handle some special cases
    if(pBytes == 0) return '0 Bytes';
    if(pBytes == 1) return '1 Byte';
    if(pBytes == -1) return '-1 Byte';

    var bytes = Math.abs(pBytes)
    if(pUnits && pUnits.toLowerCase() && pUnits.toLowerCase() == 'si') {
        // SI units use the Metric representation based on 10^3 as a order of magnitude
        var orderOfMagnitude = Math.pow(10, 3);
        var abbreviations = ['Bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    } else {
        // IEC units use 2^10 as an order of magnitude
        var orderOfMagnitude = Math.pow(2, 10);
        var abbreviations = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
    }
    var i = Math.floor(Math.log(bytes) / Math.log(orderOfMagnitude));
    var result = (bytes / Math.pow(orderOfMagnitude, i));

    // This will get the sign right
    if(pBytes < 0) {
        result *= -1;
    }

    // This bit here is purely for show. it drops the percision on numbers greater than 100 before the units.
    // it also always shows the full number of bytes if bytes is the unit.
    if(result >= 99.995 || i==0) {
        return result.toFixed(0) + ' ' + abbreviations[i];
    } else {
        return result.toFixed(2) + ' ' + abbreviations[i];
    }
}

13

यहाँ एक लाइनर है:

val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]

या और भी:

val => 'BKMGT'[~~(Math.log2(val)/10)]


अच्छा है? लेकिन अगर 1k 1024 1000 नहीं है?
l2aelba

2
इस गणना है 1k के रूप में 2 ^ 10, के रूप में 2 ^ 20 और इतने पर 1m इलाज। यदि आप 1k 1000 चाहते हैं, तो आप इसे log10 का उपयोग करने के लिए थोड़ा बदल सकते हैं।
iDaN5x

1
यहाँ एक संस्करण है जो 1K को 1000 के रूप में मानता है:val => 'BKMGT'[~~(Math.log10(val)/3)]
iDaN5x

1
यह अच्छा है! मैंने अपने फंक्शन से अपने द्वारा चाहा गया पूरा स्ट्रिंग वापस करने के लिए इस पर विस्तार किया:i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
v0rtex

4

बिटवाइज ऑपरेशन का उपयोग करना एक बेहतर समाधान होगा। इसे इस्तेमाल करे

function formatSizeUnits(bytes)
{
    if ( ( bytes >> 30 ) & 0x3FF )
        bytes = ( bytes >>> 30 ) + '.' + ( bytes & (3*0x3FF )) + 'GB' ;
    else if ( ( bytes >> 20 ) & 0x3FF )
        bytes = ( bytes >>> 20 ) + '.' + ( bytes & (2*0x3FF ) ) + 'MB' ;
    else if ( ( bytes >> 10 ) & 0x3FF )
        bytes = ( bytes >>> 10 ) + '.' + ( bytes & (0x3FF ) ) + 'KB' ;
    else if ( ( bytes >> 1 ) & 0x3FF )
        bytes = ( bytes >>> 1 ) + 'Bytes' ;
    else
        bytes = bytes + 'Byte' ;
    return bytes ;
}

1
शेष बाइट्स प्राप्त करें। वह दशमलव भाग प्रदान करेगा।
बज़ LIghtyear

1
इसकी 1024. यदि आपको 100 बिट्स के अनुसार शिफ्ट करने की आवश्यकता है।
बज़ LIghtyear


3
कृपया इसे समझे या कम से कम इसका परीक्षण किए बिना इंटरनेट से कोड न हड़पें। यह कोड का एक अच्छा उदाहरण है जो बस गलत है। इसे पास करके इसे चलाने की कोशिश करें 3 (रिटर्न "1Bytes") या 400000।
अमीर हकीघाट

10
प्रिय अमीर हाथीघाट, यह मेरे द्वारा लिखा गया एक मूल कोड है। Javasript पोस्ट में पूर्णांक मूल्य के 32 बिट्स कोड काम नहीं करेंगे क्योंकि पूर्णांक केवल चार बाइट्स है। ये बुनियादी प्रोग्रामिंग इन्फोस हैं जिन्हें आपको जानना चाहिए। Stackoverflow केवल लोगों का मार्गदर्शन करने के लिए होती है न कि चम्मच खिलाने के लिए।
बज़ लिगियरियर

4

एलिकेलज्म के उत्तर के अनुसार , मैंने दशमलव के बाद 0 हटा दिया:

function formatBytes(bytes, decimals) {
    if(bytes== 0)
    {
        return "0 Byte";
    }
    var k = 1024; //Or 1 kilo = 1000
    var sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"];
    var i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + " " + sizes[i];
}

2

मैंने मूल रूप से एक फ़ाइल अपलोड परियोजना के लिए @Aliceljm के उत्तर का उपयोग किया था, जिस पर मैं काम कर रहा था, लेकिन हाल ही में एक मुद्दे पर भाग गया जहाँ एक फ़ाइल थी, 0.98kbलेकिन जैसा पढ़ा जा रहा था 1.02mb। यहां अपडेट किया गया कोड अब मैं उपयोग कर रहा हूं।

function formatBytes(bytes){
  var kb = 1024;
  var ndx = Math.floor( Math.log(bytes) / Math.log(kb) );
  var fileSizeTypes = ["bytes", "kb", "mb", "gb", "tb", "pb", "eb", "zb", "yb"];

  return {
    size: +(bytes / kb / kb).toFixed(2),
    type: fileSizeTypes[ndx]
  };
}

फ़ाइल को इस तरह जोड़े जाने के बाद उपरोक्त को फिर कहा जाएगा

// In this case `file.size` equals `26060275` 
formatBytes(file.size);
// returns `{ size: 24.85, type: "mb" }`

दी, विंडोज के रूप में फ़ाइल पढ़ता है, 24.8mbलेकिन मैं अतिरिक्त परिशुद्धता के साथ ठीक हूँ।


2

यह समाधान पिछले समाधानों पर बनाता है, लेकिन मीट्रिक और बाइनरी दोनों इकाइयों को ध्यान में रखता है:

function formatBytes(bytes, decimals, binaryUnits) {
    if(bytes == 0) {
        return '0 Bytes';
    }
    var unitMultiple = (binaryUnits) ? 1024 : 1000; 
    var unitNames = (unitMultiple === 1024) ? // 1000 bytes in 1 Kilobyte (KB) or 1024 bytes for the binary version (KiB)
        ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']: 
        ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    var unitChanges = Math.floor(Math.log(bytes) / Math.log(unitMultiple));
    return parseFloat((bytes / Math.pow(unitMultiple, unitChanges)).toFixed(decimals || 0)) + ' ' + unitNames[unitChanges];
}

उदाहरण:

formatBytes(293489203947847, 1);    // 293.5 TB
formatBytes(1234, 0);   // 1 KB
formatBytes(4534634523453678343456, 2); // 4.53 ZB
formatBytes(4534634523453678343456, 2, true));  // 3.84 ZiB
formatBytes(4566744, 1);    // 4.6 MB
formatBytes(534, 0);    // 534 Bytes
formatBytes(273403407, 0);  // 273 MB

2

function bytesToSize(bytes) {
  var sizes = ['B', 'K', 'M', 'G', 'T', 'P'];
  for (var i = 0; i < sizes.length; i++) {
    if (bytes <= 1024) {
      return bytes + ' ' + sizes[i];
    } else {
      bytes = parseFloat(bytes / 1024).toFixed(2)
    }
  }
  return bytes + ' P';
}

console.log(bytesToSize(234));
console.log(bytesToSize(2043));
console.log(bytesToSize(20433242));
console.log(bytesToSize(2043324243));
console.log(bytesToSize(2043324268233));
console.log(bytesToSize(2043324268233343));



1

मैं यहां @Aliceljm उत्तर अपडेट कर रहा हूं। चूँकि दशमलव स्थान 1,2 अंकों की संख्या के लिए मायने रखता है, इसलिए मैं पहले दशमलव स्थान का चक्कर लगा रहा हूँ और पहले दशमलव स्थान को बनाए रखता हूँ। 3 अंकों की संख्या के लिए, मैं इकाइयों के स्थान को बंद कर रहा हूं और सभी दशमलव स्थानों की अनदेखी कर रहा हूं।

getMultiplers : function(bytes){
    var unit = 1000 ;
    if (bytes < unit) return bytes ;
    var exp = Math.floor(Math.log(bytes) / Math.log(unit));
    var pre = "kMGTPE".charAt(exp-1);
    var result = bytes / Math.pow(unit, exp);
    if(result/100 < 1)
        return (Math.round( result * 10 ) / 10) +pre;
    else
        return Math.round(result) + pre;
}

0

यह एक बाइट को मानव को कैसे दिखाया जाना चाहिए:

function bytesToHuman(bytes, decimals = 2) {
  // https://en.wikipedia.org/wiki/Orders_of_magnitude_(data)
  const units = ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"]; // etc

  let i = 0;
  let h = 0;

  let c = 1 / 1023; // change it to 1024 and see the diff

  for (; h < c && i < units.length; i++) {
    if ((h = Math.pow(1024, i) / bytes) >= c) {
      break;
    }
  }

  // remove toFixed and let `locale` controls formatting
  return (1 / h).toFixed(decimals).toLocaleString() + " " + units[i];
}

// test
for (let i = 0; i < 9; i++) {
  let val = i * Math.pow(10, i);
  console.log(val.toLocaleString() + " bytes is the same as " + bytesToHuman(val));

}

// let's fool around
console.log(bytesToHuman(1023));
console.log(bytesToHuman(1024));
console.log(bytesToHuman(1025));

0

मैं सिर्फ अपना इनपुट साझा करना चाहता था। मुझे यह समस्या थी इसलिए मेरा समाधान यही है। यह निचली इकाइयों को उच्च इकाइयों में बदल देगा और इसके विपरीत केवल तर्क की आपूर्ति करेगा toUnitऔरfromUnit

export function fileSizeConverter(size: number, fromUnit: string, toUnit: string ): number | string {
  const units: string[] = ['B', 'KB', 'MB', 'GB', 'TB'];
  const from = units.indexOf(fromUnit.toUpperCase());
  const to = units.indexOf(toUnit.toUpperCase());
  const BASE_SIZE = 1024;
  let result: number | string = 0;

  if (from < 0 || to < 0 ) { return result = 'Error: Incorrect units'; }

  result = from < to ? size / (BASE_SIZE ** to) : size * (BASE_SIZE ** from);

  return result.toFixed(2);
}

मुझे यहां से आइडिया मिला


0
function bytes2Size(byteVal){
    var units=["Bytes", "KB", "MB", "GB", "TB"];
    var kounter=0;
    var kb= 1024;
    var div=byteVal/1;
    while(div>=kb){
        kounter++;
        div= div/kb;
    }
    return div.toFixed(1) + " " + units[kounter];
}

यह फ़ंक्शन आसानी से समझने और अनुसरण करने वाला है - आप इसे किसी भी भाषा में लागू कर सकते हैं। यह बाइट मान का एक दोहराया विभाजन है जब तक आप बाइट स्तर (इकाई) प्राप्त नहीं करते हैं जो
1kb

बस एक त्वरित नोट, बाइनरी उपसर्गों के बीच अंतर हैं। कुछ एसआई बेस 10 नियम का पालन करते हैं और कुछ फॉलो बेस 2. आप यहां और पढ़ सकते हैं । हालाँकि, यदि आप k को 1024 का मानते हैं, तो विभाजन के बजाय, आप बस शिफ्ट ऑपरेटर जैसे उपयोग कर सकते हैं byteVal >> 10। इसके अलावा, आप Math.trunc()वास्तविक संख्याओं को पूर्णांक के बजाय 1 से घटाकर बेहतर करने के लिए उपयोग करेंगे
चालाक

कृपया केवल कोड को उत्तर के रूप में पोस्ट न करें, बल्कि यह भी बताएं कि आपका कोड क्या करता है और यह कैसे प्रश्न की समस्या को हल करता है। स्पष्टीकरण के साथ उत्तर आमतौर पर उच्च गुणवत्ता वाले होते हैं, और अपवोट को आकर्षित करने की अधिक संभावना होती है।
मार्क रोटेवेल

-7

इस सरल समाधान की कोशिश करो।

var files = $("#file").get(0).files;               
                var size = files[0].size;
                if (size >= 5000000) {
alert("File size is greater than or equal to 5 MB");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.